Почему моя страница PHP отправляет форму через страницу, которая ее перенаправила?

#php #forms #redirect

Вопрос:

У меня есть index.php это проверяет, вошел ли пользователь в систему, если нет, перенаправляет пользователя на страницу входа следующим образом:

 <?php 
    session_start();
    $_SESSION["page_identifier"] = "index"; 
    include "inc/header.php"; 

    if(!isset($_SESSION["loggedin"]) OR !$_SESSION["loggedin"] == TRUE){
        echo "ERROR: Not logged in!";
        header("Refresh: 3; url = login.php");
    }
    else{
         ......
    }
?>
 

Это страница входа в систему.

 <?php 
    $_SESSION["page_identifier"] = "login";
    $_SESSION["form_identifier"] = "login";   
    include "inc/header.php"; 
?>
    <div>
        <form action="submission.php" name="login" method="POST">
            <input class="textBox" type="text" name="username" placeholder="Enter your username" maxlength="20"/>
            <input class="textBox" type="password" name="password" placeholder="Enter your password" maxlength="20"/><br><br>
            <input class="button" type="submit" value="Submit"/>
        </form>
        <form class="register" action="register.php">
            <input class="button" type="submit" value="New user? Register"/>
        </form>
    </div>
<?php include "inc/footer.php"; ?>
 

Каждая страница задает $_SESSION["form_identifier"] свое имя страницы, при отправке формы я проверяю файл отправки, из которого она была получена, следующим образом:

 <?php
    session_start();
    $_SESSION["page_identifier"] = "submission";
    
    //checking if the form is a login form.
    if($_SESSION["form_identifier"] == "login"){
        .......
    }
 

Это показывает, что от исходит от «NULL», а не от «входа в систему». Почему это происходит и есть ли способ это изменить?

Комментарии:

1. Похоже, вы забыли указать session_start(); вверху страницы входа в систему

2. P. s. просто совет, добавление идентификаторов страниц в сеанс приведет к неожиданному поведению и, возможно, ошибкам, если пользователи откроют ваш сайт более чем на одной вкладке своего браузера, а затем продолжат переключаться между ними — что является довольно распространенным поведением. Эти вкладки будут использовать один и тот же сеанс, поэтому легко увидеть, что на сервере может возникнуть путаница в том, с какой страницы «пришел» запрос на самом деле. Использование браузера не обязательно является линейным процессом.

3. Ну, точные детали немного зависят от обстоятельств. Есть ли на вашем сайте какие-либо общедоступные страницы или все они являются частными, за исключением страницы входа в систему? И каковы сценарии, в которых вам действительно нужно знать страницу/URL, с которой вы пришли (в отличие от страницы/URL, которая сейчас обрабатывается)? По моему опыту в подобных вещах необходимо знать URL-адрес страницы входа в систему, чтобы при загрузке страницы входа в систему код не гласил «пользователь не вошел в систему, перенаправьте на страницу входа в систему» и, таким образом, создайте бесконечный цикл…

4. …единственный другой раз, когда вам нужно знать, на какой странице вы сейчас находитесь, — это если некоторые страницы являются частными, а некоторые общедоступными, чтобы вы снова могли решить, нужно ли перенаправлять пользователя, если он не вошел в систему или нет. Это может быть достигнуто за счет наличия списка (в файле или базе данных) страниц, на которые требуется войти пользователю, и их URL-адресов. Это или вы помещаете код на каждую из тех страниц, которые проверяются, но тогда вы обычно получаете избыточный код — лучше его централизовать.

5. Да, это действительно правильный подход к этому.

Ответ №1:

На этот вопрос ответил АДисон в комментариях, я забыл поставить «session_start();» на странице входа в систему.