Приветствую. Почему в одном случае die() отменяет ВСЕ следующие после нее инструкции и даже htm-тэги, а в другом случае все запускает стабильно даже после функции die()? Собственно, мой пример из курса по php: приложение с легкой авторизацией и секретной страницей. Ввел данные верно - увидел контент, ввел не верно - не увидел. Оно работает, но так как код не мой - хочу в нем разобраться. Спасибо тем, кто выручит)) Первый файл(train1.php). PHP: <?php session_start(); define("KEY", "key"); if( !empty($_POST["inf"]) ){ if($_POST["inf"]===KEY){ $_SESSION["key"]=KEY; $_SESSION["res"] = "Добро пожаловать!"; }else{ $_SESSION["res"] = "Неверный логин/пароль"; } header("Location:train1.php"); die; } ?> <?php if( !empty($_SESSION["res"])){ echo $_SESSION["res"]; unset($_SESSION["res"]); } ?> <ul></ul> <li><a href="train1.php">Train1</a></li> <li><a href="secret.php">Secret</a></li> </ul> <form action="" method="post"> <input type="text" name="inf"> <button type="submit">SEND</button> </form> Секретный файл (secret.php). PHP: <?php session_start(); if(isset ($_GET["do"]) && $_GET["do"]="exit"){ unset($_SESSION["key"]); } if( !isset ($_SESSION["key"]) ){ die("Ошибка доступа"); }; echo "Привет"; ?> <a href="secret.php?do=exit">LogOut</a> <ul></ul> <li><a href="train1.php">Train1</a></li> <li><a href="secret.php">Secret</a></li> </ul> п.с. лично у меня ток 1 версия: функция header(), выполняющая редирект. То есть die() и тут отменяет все последующие действия, НО страница загружается потому, что ДО функции die() был сделан ее редирект и она была перезапрошена - поэтому все и отобразилось даже с die(). Но если моя догадка верна, и отображение страницы даже с die() - это результат редиректа, ПОЧЕМУ я не могу то же самое сделать со страницей secret.php? При попытке впихнуть редирект и туда (для проверки), у меня отображается ошибка, а должна быть - пустая страница. Вот так это выглядит. secret.php (с редиректом для проверки - итог, ошибка, а не пустая страница) PHP: <?php session_start(); if(isset ($_GET["do"]) && $_GET["do"]="exit"){ unset($_SESSION["key"]); } if( !isset ($_SESSION["key"]) ){ header("Location:secret.php"); die; }; echo "Привет!"; ?> <a href="secret.php?do=exit">LogOut</a> <ul></ul> <li><a href="train1.php">Train1</a></li> <li><a href="secret.php">Secret</a></li> </ul> Спасибо всем, кто не запутался) Изучаю несколько дней PHP, после JS идет интересно))
Выполнение после die прекращается всегда. В первом случае потом браузер повторно запрашивает страницу, потому что был редирект саму на себя, вы правы. Во втором - ну вы по ходу делаете зацикленный редирект, поскольку нужному значнию в сессии появиться неоткуда
Зацикленный? Ошибка как раз об этом и повествовала) А как выходит, что одинаковый код по-разному работает на разных страницах? Неужели все дело в условии: в первом случае (где норм работает все), редирект происходит только при попытке отправки данных (а в остальное время все стабильно), а во втором случае (где цикл) редирект происходит постоянно потому, что постоянно отсутствует нужная запись в сессии?
@Andarilz, главное, что должен усвоить программист - машина делает ровно то, что ей сказали. А во втором скрипте сказано: если нету записи в сессии, редиректнуть саму на себя. Спрашивается, каким образом между этими редиректами должна появиться запись? --- Добавлено --- Глюки в PHP быть могут, но вероятность, что вы столкнётесь именно с неправильной работой самого php, а не вашего кода, ничтожно мала. Лично я за 6 лет коммерческой разработки ни разу не сталкивался.
Спасибо, последний вопрос: почему редирект обрабатывает то, что идет после die()? Он же сверху вниз все читает. нашел die и должен был остановиться. Но он все обработал.
Нет, он остановился и вернул заголовок с редиректом. Браузер увидел заголовок с редиректом, и перезагрузил страницу. Уже методом GET, а не пост, поэтому в переменной $_POST не нашли того, что искали http://phpfaq.ru/newbie/na_tanke - читать до просветления
Что бы выполнился die() необходимо что бы сначала сработало условие в которое этот die() завёрнут. Если ты этого не понимаешь бросай программирование, без логики в нём ну вот совсем никак.
Теперь-то все ясно) В типах запросов дело. --- Добавлено --- Это-то самое просто, а вот тот факт, что редирект перезапрашивает страницу именно get-запросом, на поверхности не лежало.