PHP-код не будет выполняться, если в определенном месте не появится эхо. Почему это?

    $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 

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

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


person LJ Wiest-Berger    schedule 14.12.2011    source источник
comment
Это почти нечитаемо. Можете ли вы быть более кратким?   -  person ldiqual    schedule 14.12.2011
comment
Некоторые варианты уже отправленных заголовков и включена или нет функция output_buffering.   -  person mario    schedule 14.12.2011
comment
Оборачивайте вызовы header() как exit(header("..."));, когда они должны быть окончательными.   -  person mario    schedule 14.12.2011


Ответы (2)


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

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

@ldiqual то же самое; Я как раз писал это, когда пришел твой ответ ;)

person quickshiftin    schedule 14.12.2011
comment
Да, я определенно получаю ошибку вывода, когда включено первое эхо. Но дело не в этом. Проблема в том, что без эха оператор заголовка НЕ ​​ВЫПОЛНЯЕТСЯ. Когда у меня есть первый оператор эха, оператор заголовка будет выполняться, но в противном случае он ничего не делает и перенаправляет на текущую страницу. - person LJ Wiest-Berger; 14.12.2011
comment
Кроме того, я твердо знаю, что нет пробелов или проблем с включениями. - person LJ Wiest-Berger; 14.12.2011
comment
@ LJWiest-Berger, вы уверены, что условие if все еще выполняется, когда у вас отключено эхо? Есть несколько вещей, которые вы можете попробовать, например, записать что-то прямо перед вызовом заголовка, вызвать заголовок, за которым следует штамп, где вы не заключаете вызов заголовка в условие if и т. д. Вы также можете обнюхать трафик с помощью чего-то вроде tcpmon или поджигатель. Я предполагаю, что это что-то с условиями. Если у вас нет заголовка эха и вызова, он должен работать. - person quickshiftin; 14.12.2011
comment
Я имею в виду, это должно быть правильно? Не должно быть причин, по которым стандартное эхо влияет на условие if, верно? Я не меняю никаких переменных или чего-то еще. Следует отметить, что функция, похоже, не выполняется (любое эхо после вызова заголовка не выполняется). Это говорит мне, что что-то не так с вызовом заголовка, но каждый раз, когда я его вывожу, он показывает правильную страницу. Это не может не расстраивать. - person LJ Wiest-Berger; 14.12.2011

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

Согласно PHP: заголовок:

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

person ldiqual    schedule 14.12.2011