Подтвердить что ты не робот

PHP: использование exit(); или умереть(); после заголовка ( "Местоположение:" );

У меня есть система входа/регистрации пользователя, которая просто использует

// execute queries, set cookies, etc. here
header("Location: " . getenv("HTTP_REFERER"));

Недавно я прочитал сообщение о exit(); и die(); и понятия не имел, что я должен использовать их. Насколько я понимаю, они заканчивают PHP? Это верно? Каким образом я могу работать с этим, просто добавив одну из этих функций сразу после header(); у меня есть?

У меня есть AJAX, чтение jQuery через мой login.php/register.php, это повлияет каким-либо образом?

Изменить: кроме заголовка();, где еще я должен использовать функции exit(); или die();? И exit(); больше используется вокруг PHP, тогда как die(); больше используется вокруг Perl?

4b9b3361

Ответ 1

Я тоже искал ответ на этот вопрос. Что я нашел:

Почему die() или exit():

Если вы не положите die() или exit() после своего header('Location: http://something'), ваш script может продолжать приводить к неожиданному поведению. Это может привести, например, к раскрытию содержимого, которое вы действительно хотели предотвратить с помощью перенаправления (HTTP 301). Вышеупомянутый не может быть непосредственно видимым для конечного пользователя, поскольку браузер не может его отобразить (из-за 301). Вывод, функции exit() и die() останавливают script от продолжения.

Разница:

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

Выход() в действии

<?php
    header('HTTP/1.1 304 Not Modified');
    exit();
?>

Результаты в:

HTTP/1.1 304 Not Modified 
Connection: Keep-Alive 
Keep-Alive: timeout=5, max=100

Die() в действии

<?php
    header('HTTP/1.1 304 Not Modified');
    die();
?>

Результаты в:

HTTP/1.1 304 Not Modified 
Connection: close

Разница

Итак, die() закрывает соединение, а exit() - нет. Это зависит от производительности, независимо от того, хотите ли вы открыть соединение или закрыть его. Оба имеют преимущества и недостатки и зависят от ваших конкретных требований.

HTTP-постоянные соединения в Wiki

Ответ 2

http://php.net/manual/en/function.exit.php

http://php.net/manual/en/function.die.php

Эти функции используются для прерывания выполнения script. Вам нужно использовать exit или die, чтобы остановить выполнение вашего script после header("Location: " . getenv("HTTP_REFERER"));, потому что в другом случае ваш script будет выполнен до конца, что может привести к неожиданному поведению.

Ответ 3

Ответ уже принят, но кажется, что у всех отсутствует вопиющий WTF в вопросе:

header("Location: " . getenv("HTTP_REFERER"));
  • Возврат референта необязателен со стороны пользовательского агента

  • его легко подделать

  • нет способа сообщить пользователю, что логин завершился неудачно

  • нет семантической связи HTTP с ошибкой аутентификации

  • в то время как переменная среды HTTP_REFERER должна быть такой же, как переменная заголовка запроса, она не указана в RFC 3875, поэтому даже там, где она представлена ​​веб-серверу в запросе, getenv ( "HTTP_REFERER" ) может возвращать другую значение

Ответ 4

Когда header() вызывается в конце script, нет необходимости вызывать exit(), а не die(), поскольку:

Ссылка на сервер будет закрыта, как только завершится выполнение script, если только он не закрыт раньше, явно вызвав mysql_close(). - php.net/function.mysql-connect

Ответ 5

Хорошо, прошло много времени с момента последнего ответа. Во всяком случае: D как-то я наткнулся на подобную проблему и посмотрел, что мое решение было:

die( Header( "Location: mytarget.php?arg1=foobar" ) );

Две птицы с одним камнем, похоже, работают на меня.

Ответ 6

for($i = 0; $i < 10; $i++)
{
    if ($i == 2)
    {
        exit("\n Using exit(), We are done");
    }
}

Теперь давайте посмотрим на тот же пример, используя die();

for($i = 0; $i < 10; $i++)
{
    if ($i == 2)
    {
        die("\n Using die(), We are done");
    }
}

Выводом для каждого из них будет: "Использование exit(), мы закончили, используя die(), мы закончили" соответственно). Теперь давайте попробуем каждый из них вывести число.

for($i = 0; $i < 10; $i++)
{
    if ($i == 2)
    {
        exit(-1);
    }
}

Просмотр выходных данных для того же примера с использованием die();

for($i = 0; $i < 10; $i++)
{
    if ($i == 2)
    {
        die(-1);
    }
}

Эти примеры были отредактированы с использованием редактора текстовой панели. В обоих вышеупомянутых случаях вывод был "Инструмент завершен с кодом выхода -1".

Итак, честный ответ на вопрос "В чем разница между die() и exit() в php" - это не видимая разница между этими двумя функциями. Они оба одинаковы, один псевдоним другого. Если кто-либо из вас сможет найти реальную заметную разницу, я был бы признателен, если бы вы опубликовали это в разделе комментариев этого блога.

До следующего раза, счастливого программирования на PHP!