PHP if-оператор игнорируется, когда header (Location: xxx) находится внутри - PullRequest
2 голосов
/ 27 мая 2011

У меня странная проблема. Вверху моей страницы есть оператор if, который, кажется, игнорируется, когда внутри него находится команда header (location: xxx).

$check = $authorisation->check(); 
// i know this results in true by echoing the value 
// (you've got to believe me on this one)

if(!$check){
    // redirect to message
    header("Location: message.php");
    exit;

}else{
    // do nothing, continue with page
}

Это ВСЕГДА перенаправляет на страницу message.php, независимо от результата $ authorisation-> check ()!

Странно то, что когда я закомментирую команду заголовка и добавлю эхо в оператор if для проверки, все будет работать так, как и ожидалось:

    $check = $authorisation->check(); // true
    if(!$check){
        // redirect to message
        echo "you are not welcome here";
    }else{
        echo "you may enter";
    }

Результат "вы можете войти";

Это также работает как ожидалось:

    $check = true;
    if(!$check){
        // redirect to message
        header("Location: message.php");
        exit;

    }else{
        // do nothing
    }

Это перенаправляет на страницу сообщения только когда $ check = false;

Последнее, что забавно, я испытываю проблему только на 1 сервере, этот же скрипт работает безупречно на testserver.

Любая помощь будет высоко ценится!

Ответы [ 6 ]

4 голосов
/ 27 мая 2011

Вызовите функцию exit после перенаправления на другую страницу, в противном случае в любом случае будет выполнен следующий код.

if(!$check){
  // redirect to message
  header("Location: message.php");
  exit;
}else{
  // do nothing, continue with page
}
// the following code will be executed if exit is not called
...
4 голосов
/ 27 мая 2011

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

Попробуйте так:

if( ... )
{
     header("Location: message.php");
     exit;
}

// ...

Пожалуйста, прочитайтекомментарий к другим советам о том, почему это хорошая идея.

2 голосов
/ 27 мая 2011

Ошибка такого рода часто вызывается отправкой содержимого в браузер до вызова функции заголовка.

Даже если вы не думаете, что отправляете контент, если ваш файл начинается с пробела или пустой строки перед «<? Php», вы получите сообщение об ошибке - это часто довольно трудно заметить / найти. </p>

Буферизация вывода может позволить вам вызывать функцию заголовка даже после того, как вы «отправили» контент - возможно, поэтому страница работает на одном сервере, а не на другом.

2 голосов
/ 27 мая 2011

Попробуйте поставить error_reporting(-1);, вы увидите что-то новое.На одном из ваших серверов отчеты об ошибках PHP установлены на более низкий уровень.

0 голосов
/ 12 февраля 2013

У меня была такая же проблема, вы вызываете header ('Location: blahblah') где-то еще в коде.проверь это.

0 голосов
/ 27 мая 2011

предложение:

  • напишите ob_start() вверху и

  • такженаписать exit(); после header();

  • отладка с error_reporting(-1), как предлагается в одном ответе

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...