2011-12-14 1 views
0
$result=mysql_query($sql_info) or die("Error 1: ".mysql_error()); 
    $no= mysql_fetch_array($result); 

    $groups_no = $no['number']; 
    mysql_num_rows($result) or die("Error 2: ".mysql_error());  

// echo "what's going on?"; if I uncomment this line then the echo below executes 
    if(($this->user_group=="I am Talent") &&($groups_no==0)) {    
     header("Location: ".MAIN_URL.$this->groups_page); 
        echo "what's going on?"; //THIS DOESN'T EXECUTE BY ITSELF...WHY NOT?? 
    } 
    if(mysql_result(mysql_query(sprintf("SELECT last_update FROM `users_profile` WHERE users_id=%d LIMIT 1",$this->id)),0)==0) { 

     header("Location: ".MAIN_URL.$this->groups_page); 
    } 
     echo "what's going on?"; //won't execute unless the line above 

Кто-нибудь знает, почему приведенный выше код не будет работать, если не существует эхо-инструкции? Я подтвердил с помощью ручных проверок базы данных, что должен выполняться оператор first if.PHP-код не будет выполняться, если в определенном месте нет эха. Почему это?

Это должно привести к перенаправлению страницы на ссылку, хранящуюся в переменной MAIN_URL. $ This-> groups_page (и это отсутствие перенаправления было исходной проблемой). Однако часть заголовка («Местоположение: ...») не выполняется, если нет эха в инструкции if или выше оператора if. Почему это так? Я поставил выражение эха ПОСЛЕ заголовка («Местоположение:» .MAIN_URL. $ This-> groups_page); строка в первом if-statement и не выполнялась. Это будет выполняться только в том случае, если у меня была команда echo перед строкой заголовка (...).

+0

Это почти нечитаемо. Вы можете быть более краткими? –

+0

Я постараюсь сварить его. –

+0

Некоторые варианты [заголовки уже отправлены] (http://stackoverflow.com/search?q=headers%20already%20sent) и output_buffering включены или нет. – mario

ответ

1

Поскольку вы не можете выводить ничего перед установкой заголовков HTTP. Обычно вы должны получить ошибку PHP, например Headers already sent by.... HTTP-заголовки (в вашем случае: Location: ...) отправляются в браузер перед телом.

По PHP: header:

Помните, что заголовок() должна вызываться перед любой фактический вывод направляется, либо с помощью обычных HTML-теги, пустые строки в файле, или из PHP. Очень распространенная ошибка для чтения кода с функциями include() или require(), функций или другой функции доступа к файлам, а также пробелы или пустые строки, которые выводятся перед вызовом header(). Та же проблема существует при использовании одного файла PHP/HTML.

2

Это эхо действительно не влияет на другое эхо. Я подозреваю, что второе эхо обычно не выполняется, потому что перенаправление местоположения сначала отправляется в браузер, и последнее эхо никогда не отображается.

Если вы включили первое эхо, и затем один из заголовков местоположений отправляется в браузер, PHP должен выпустить сообщение об ошибке, указывающее, что выход уже запущен (по первому эхо). В этом случае второе эхо может быть показано через, b/c заголовки не могут быть отправлены в этой точке.

@ldiqual ditto; Я был посреди публикации, когда вы ответили;)

+0

Да, я определенно получаю ошибку вывода, когда включено первое эхо. Но это не проблема. Проблема в том, что без эха оператор заголовка НЕ ​​ВЫПОЛНИТЬ. Когда у меня есть первый оператор echo, оператор заголовка будет выполняться, но в остальном он ничего не делает и перенаправляет на текущую страницу. –

+0

Кроме того, я твердо знаю, что нет пробелов или проблем с включенными. –

+0

@ LJWiest-Berger вы ** уверены ** условие if все еще преуспевает, когда вы отключили эхо-сигнал? Есть несколько вещей, которые вы могли бы попробовать, например, записывать что-то прямо перед вызовом заголовка, вызывать заголовок, за которым следует штамп, где вы не завершаете вызов заголовка в условии if и т. Д. Вы также можете обнюхивать трафик чем-то вроде tcpmon или firebug. Я предполагаю, что это что-то с условиями. Если у вас нет заголовка эха и звонка, он должен работать. – quickshiftin