Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

HTML+CSS+JavaScript

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: ajax, responseText
 
 автор: mikado3333   (20.08.2013 в 14:03)   письмо автору
 
 

Приветствую!

Суть проблемы: при запросе

var t;
        if (window.XMLHttpRequest)
            {
                t=new XMLHttpRequest();
            }
        else 
            {
                t=new ActiveXObject("Microsoft.XMLHTTP");
            }    
        
        t.onreadystatechange=function()
                                    {
                                        if (t.readyState==4 && t.status==200)    
                                        document.getElementById('in_info').innerHTML=t.responseText;
                                    }                                
        t.open('POST','all/2/tit_list.php',true);
        t.setRequestHeader('Content-type','application/x-www-form-urlencoded');
        var str = 'number=' + a;
        t.send(str);


t.responseText возвращает содержимое и добавляет пустую строку в начало содержимого. Как показали опыты виной всему наличие MySql запроса в файле tit_list.php .

код Mysql запроса в tit_list.php


$Sql = mysql_query ("select * FROM AIRPLAN_$number  where STATYS = 'ОТКРЫТ'||STATYS = 'ПЕРЕАДРЕСОВАН'order by N") or die("НЕ могу собрать");    // собираем массив
    while ($dp = @mysql_fetch_object ($Sql))
        {
            $MQ = $dp -> CEH_KOMY;
                (!in_array($MQ,$mass_ceh)) ? $mass_ceh[]= $MQ :1;
        }


Как убрать пустую строку?

  Ответить  
 
 автор: confirm   (20.08.2013 в 17:24)   письмо автору
 
   для: mikado3333   (20.08.2013 в 14:03)
 

Ну так почему не разберетесь с php-кодом отдельно (кстати в нем нет вывода вообще, если только не ошибка), без ajax?
Вы на современные браузеры рассчитываете?

  Ответить  
 
 автор: mikado3333   (20.08.2013 в 17:50)   письмо автору
 
   для: confirm   (20.08.2013 в 17:24)
 

Вот весь код tit_list.php


<?
$number 
= ($_POST ['number']);
include(
"conect.inc");
////////////////////////////////////////////////////////////////////////////////////////// вывод титульного листа

    
echo"<p class = 'tit_zag'>* ТИТУЛЬНЫЙ ЛИСТ *</p>";        
                                                        
$mass_ceh=array("");                                                                     // массив с номерами цехо и служб используемых в журнале в колонке кому
$Sql mysql_query ("select * FROM AIRPLAN_$number  where STATYS = 'ОТКРЫТ'||STATYS = 'ПЕРЕАДРЕСОВАН'order by N") or die("НЕ могу собрать массив цехов");    // собираем массив
    
while ($dp = @mysql_fetch_object ($Sql))
        {
            
$MQ $dp -> CEH_KOMY;
                (!
in_array($MQ,$mass_ceh)) ? $mass_ceh[]= $MQ :1;
        }
    unset(
$mass_ceh[0]);
    
natsort($mass_ceh);

    foreach(
$mass_ceh as $k=>$z)
        {
            (
$z >0) ? $slovo 'ЦЕХ' $slovo '';
            echo 
"<div  class = 'block'>";
            echo 
"<span class = 'nomer_ceha'> $slovo $z </span>";
            echo 
"<input type = \"button\" value = \"i\" class = \"info_button\" onclick= 'info(\"$z\",\"$number\");'>";
            echo 
"<div class = 'nomera_voprosov'>";$v1OPROS ($number,$z);
            echo 
"</div>";
            echo 
"<br></div><br>";    
        }
            
?>

Да, на современные браузеры. Методом добавления /удаления выяснил , что если только имеется MySql запрос то появляется дополнительная пустая строка над содержимым.

  Ответить  
 
 автор: confirm   (20.08.2013 в 18:00)   письмо автору
 
   для: mikado3333   (20.08.2013 в 17:50)
 

Зачем мне код ваш, к тому же некорректный - вы даже не проверив вернул ли что либо запрос, запускаете цикл и вывод.
Выполните отдельно этот код и посмотрите что возвращается, найдете причину.

  Ответить  
 
 автор: thisismy   (20.08.2013 в 18:02)   письмо автору
 
   для: mikado3333   (20.08.2013 в 17:50)
 

Перед
document.getElementById('in_info').innerHTML=t.responseText;
сделаейте
alert('"'+t.responseText+'"');
Если пустая строка действительно есть, вы ее увидите. Лично я не вижуу причин для появления пустой строки и подозреваю, что ее нет.

  Ответить  
 
 автор: mikado3333   (20.08.2013 в 18:25)   письмо автору
21.5 Кб
 
   для: thisismy   (20.08.2013 в 18:02)
 

alert вывел два прямоугольника переде содержимым.

а вот что получается если без ajax,

  Ответить  
 
 автор: confirm   (20.08.2013 в 18:40)   письмо автору
 
   для: mikado3333   (20.08.2013 в 18:25)
 

В помойку alert, разбирайтесь на сервере. Откуда кому либо знать как у вас должно - как на картинке вашей, или нет. И не картинки надо рассматривать, а изучать код ответа, то есть вне контекста ajax то, что этот код выдает в итоге. Непонятная пустота перед данными может быть следствием BOM, если вы работаете в UTF и сохраняете свои php-файлы с BOM.

И перепишите свой php-код, он ужасен.

  Ответить  
 
 автор: mikado3333   (20.08.2013 в 18:45)   письмо автору
 
   для: confirm   (20.08.2013 в 18:40)
 

если не сложно, то опишите пару моментов - в чем ужас. Я учусь по книжкам, как в них написано так и пишу (ГИЗБЕРТ ДОМАШКЕ ) :))

  Ответить  
 
 автор: confirm   (20.08.2013 в 19:29)   письмо автору
 
   для: mikado3333   (20.08.2013 в 18:45)
 

$number = ($_POST ['number']); - зачем здесь скобки? Да и вообще, писать такое ради присвоения другой переменной зачем? Смысла то ведь в этом нет никакого, вы с успехом можете в запрос вставить и $_POST ['number']. Вот только делать этого не следует - все переменные пришедшие извне нужно проверять, приводить к типу, который вы ожидаете, экранировать. Иначе это большая потенциальная дыра в безопасности.
В данном случае вы ожидаете числовое значение, значит нужно $number = (int)$_POST ['number'];

echo"<p class = 'tit_zag'>* ТИТУЛЬНЫЙ ЛИСТ *</p>";

А ведь вы еще не сделали запроса к базе, и не известно чем он закончится, зачем же вы сразу делаете вывод в браузер этого заголовка?

while ($dp = @mysql_fetch_object ($Sql))...

А если результатом будет "ничего"? Надо наверное проверять вернул ли что-то запрос или нет, а не клеить собаку бесполезную к функции mysql_fetch_object().

<?
if(mysql_num_rows($sql)) {
   
//и удостоверившись только тогда
   
while(...) { //и без собак ненужных
      //цикл
   
}
   
//и здесь вывод, включая и заголовок, который вы выводили преждевременно
}

Вообще код нужно структурировать - определение переменных, вывод или обработка их, а не произвольная смесь. Это улучшает читаемость кода, его логику.

В запросе приучите себя писать как-то однотипно - выражения MySQL в верхнем регистре, переменные и имена полей в нижнем, так легко читать выражение, находить ошибки. Первичны конструкции mysql, а не переменные для него.

Для современных браузеров (включая и IE) объект XMLHttpRequest() определяется просто - var xhr = new XMLHttpRequest(); А вот с учетом и стареньких, для предотвращения экцессов, лучше писать так:
function newAJAX(){     // функция для создания объекта AJax
   var xhr = false;
   try {
       xhr = new XMLHttpRequest();
   } catch (trymicrosoft) {
       try {
            xhrt = new ActiveXObject("Msxml2.XMLHTTP");
       } catch (othermicrosoft) {
            try {
              xhr = new ActiveXObject("Microsoft.XMLHTTP");
            } catch (failed) {
                xhr = false;
            }
       }
   }
   return(xhr);
}

  Ответить  
 
 автор: mikado3333   (20.08.2013 в 23:03)   письмо автору
 
   для: confirm   (20.08.2013 в 19:29)
 

confirm, большое спасибо за замечания. В дальнейшем постараюсь учитывать все моменты описанные вами. По поводу моего вопроса - Вы были правы, действительно все дело в UTF-8 с Bom. Без Bom нет пустой строки, но теперь у меня вместо русских букв "крякозяблы" . Не подскажете ли куда копать с кодировками? При конекте с MySql я использую следующее


@mysql_select_db($database, $dp)or die (mysql_error());
// в какой кодировке получать данные от клиента
@mysql_query('set character_set_client="utf8"');

// в какой кодировке получать данные от БД для вывода клиенту
@mysql_query('set character_set_results="utf8"');

// кодировка в которой будут посылаться служебные команды для сервера
@mysql_query('set collation_connection="utf8_general_ci"');

  Ответить  
 
 автор: confirm   (21.08.2013 в 05:55)   письмо автору
 
   для: mikado3333   (20.08.2013 в 23:03)
 

MySQL тут не причем, и достаточно:
mysql_query("SET NAMES 'UTF8'");

Зайдите в настройки своего редактора, найдите в нем нечто похожее на "Сохранять с BOM", и снимите выбор этой опции. Сохранение без BOM не означает "изменение" кодировки, так что без BOM "теперь у меня..." непосредственно к нему отношения не имеет..

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования