За последние 24 часа нас посетили 22729 программистов и 1221 робот. Сейчас ищут 727 программистов ...

НЕ понимаю функцию die();

Тема в разделе "PHP для новичков", создана пользователем Andarilz, 18 сен 2019.

  1. Andarilz

    Andarilz Новичок

    С нами с:
    18 сен 2019
    Сообщения:
    49
    Симпатии:
    0
    Приветствую. Почему в одном случае die() отменяет ВСЕ следующие после нее инструкции и даже htm-тэги, а в другом случае все запускает стабильно даже после функции die()? Собственно, мой пример из курса по php: приложение с легкой авторизацией и секретной страницей. Ввел данные верно - увидел контент, ввел не верно - не увидел. Оно работает, но так как код не мой - хочу в нем разобраться. Спасибо тем, кто выручит))

    Первый файл(train1.php).

    PHP:
    1. <?php
    2.  
    3. define("KEY", "key");
    4.  
    5. if( !empty($_POST["inf"]) ){
    6. if($_POST["inf"]===KEY){
    7. $_SESSION["key"]=KEY;
    8. $_SESSION["res"] = "Добро пожаловать!";
    9. }else{
    10. $_SESSION["res"] = "Неверный логин/пароль";
    11. }
    12. header("Location:train1.php");
    13. }
    14. ?>
    15.  
    16.  
    17.  
    18. <?php
    19.  
    20. if( !empty($_SESSION["res"])){
    21. echo $_SESSION["res"];
    22. unset($_SESSION["res"]);
    23. }
    24.  
    25.  
    26. ?>
    27.  
    28.  
    29. <ul></ul>
    30. <li><a href="train1.php">Train1</a></li>
    31. <li><a href="secret.php">Secret</a></li>
    32. </ul>
    33.  
    34.  
    35. <form action="" method="post">
    36. <input type="text" name="inf">
    37. <button type="submit">SEND</button>
    38. </form>



    Секретный файл (secret.php).


    PHP:
    1. <?php
    2.  
    3.  
    4. if(isset ($_GET["do"]) && $_GET["do"]="exit"){
    5.     unset($_SESSION["key"]);
    6. }
    7. if( !isset ($_SESSION["key"]) ){
    8.     die("Ошибка доступа");
    9. };
    10. echo "Привет";
    11.  
    12.  
    13. ?>
    14.  
    15. <a href="secret.php?do=exit">LogOut</a>
    16.  
    17. <ul></ul>
    18.     <li><a href="train1.php">Train1</a></li>
    19.     <li><a href="secret.php">Secret</a></li>
    20. </ul>
    п.с. лично у меня ток 1 версия: функция header(), выполняющая редирект. То есть die() и тут отменяет все последующие действия, НО страница загружается потому, что ДО функции die() был сделан ее редирект и она была перезапрошена - поэтому все и отобразилось даже с die(). Но если моя догадка верна, и отображение страницы даже с die() - это результат редиректа, ПОЧЕМУ я не могу то же самое сделать со страницей secret.php? При попытке впихнуть редирект и туда (для проверки), у меня отображается ошибка, а должна быть - пустая страница. Вот так это выглядит.

    secret.php (с редиректом для проверки - итог, ошибка, а не пустая страница)


    PHP:
    1. <?php
    2.  
    3.  
    4. if(isset ($_GET["do"]) && $_GET["do"]="exit"){
    5.     unset($_SESSION["key"]);
    6. }
    7. if( !isset ($_SESSION["key"]) ){
    8.     header("Location:secret.php");
    9.     die;
    10. };
    11. echo "Привет!";
    12.  
    13.  
    14. ?>
    15.  
    16. <a href="secret.php?do=exit">LogOut</a>
    17.  
    18. <ul></ul>
    19.     <li><a href="train1.php">Train1</a></li>
    20.     <li><a href="secret.php">Secret</a></li>
    21. </ul>
    Спасибо всем, кто не запутался) Изучаю несколько дней PHP, после JS идет интересно))
     
  2. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.555
    Симпатии:
    1.754
    Выполнение после die прекращается всегда. В первом случае потом браузер повторно запрашивает страницу, потому что был редирект саму на себя, вы правы. Во втором - ну вы по ходу делаете зацикленный редирект, поскольку нужному значнию в сессии появиться неоткуда
     
    Andarilz нравится это.
  3. Andarilz

    Andarilz Новичок

    С нами с:
    18 сен 2019
    Сообщения:
    49
    Симпатии:
    0
    Зацикленный? Ошибка как раз об этом и повествовала) А как выходит, что одинаковый код по-разному работает на разных страницах? Неужели все дело в условии: в первом случае (где норм работает все), редирект происходит только при попытке отправки данных (а в остальное время все стабильно), а во втором случае (где цикл) редирект происходит постоянно потому, что постоянно отсутствует нужная запись в сессии?
     
  4. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.555
    Симпатии:
    1.754
    @Andarilz, главное, что должен усвоить программист - машина делает ровно то, что ей сказали. А во втором скрипте сказано: если нету записи в сессии, редиректнуть саму на себя. Спрашивается, каким образом между этими редиректами должна появиться запись?
    --- Добавлено ---
    Глюки в PHP быть могут, но вероятность, что вы столкнётесь именно с неправильной работой самого php, а не вашего кода, ничтожно мала. Лично я за 6 лет коммерческой разработки ни разу не сталкивался.
     
  5. Andarilz

    Andarilz Новичок

    С нами с:
    18 сен 2019
    Сообщения:
    49
    Симпатии:
    0
    Спасибо, последний вопрос: почему редирект обрабатывает то, что идет после die()? Он же сверху вниз все читает. нашел die и должен был остановиться. Но он все обработал.
     
  6. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.555
    Симпатии:
    1.754
    Нет, он остановился и вернул заголовок с редиректом. Браузер увидел заголовок с редиректом, и перезагрузил страницу. Уже методом GET, а не пост, поэтому в переменной $_POST не нашли того, что искали

    http://phpfaq.ru/newbie/na_tanke - читать до просветления
     
  7. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    Что бы выполнился die() необходимо что бы сначала сработало условие в которое этот die() завёрнут. Если ты этого не понимаешь бросай программирование, без логики в нём ну вот совсем никак.
     
  8. Andarilz

    Andarilz Новичок

    С нами с:
    18 сен 2019
    Сообщения:
    49
    Симпатии:
    0
    Теперь-то все ясно) В типах запросов дело.
    --- Добавлено ---
    Это-то самое просто, а вот тот факт, что редирект перезапрашивает страницу именно get-запросом, на поверхности не лежало.