PHP удаляет переменные сеанса при обновлении

#php #html #web-deployment

#php #HTML #веб-развертывание

Вопрос:

В настоящее время я изучаю, как создать систему входа с использованием PHP. Сначала все казалось простым — я установил входные данные в качестве $_SESSION переменных, а затем запустил сеанс на следующей странице, которую я открываю. Однако, когда я обновляю страницу, сеанс все еще работает, но данные переменной были удалены и не распознаны.


Вот мой php, который устанавливает переменные:

 <?php 
            include ("connection.php"); //connects to the database.

            if(isset($_POST['login'])) 
            {
                $user_name = $_POST['EMAIL'];
                $password = $_POST['PASSWORD'];

                // echo $user_name, " AND ", $password, "<br>";

                $q = "SELECT * FROM ".$table." WHERE EMAIL='".$user_name."' AND PASSWORD= '".$password."' AND IS_ADMIN= 'YES';";
                // echo "<br>",$q,"<br>";
                $r = mysqli_query($conn, $q); 

                if(mysqli_num_rows($r) > 0)
                {
                    if(session_id() == '' || !isset($_SESSION)) 
                    {
                        // session isn't started
                        session_start();

                        echo "<br>GREAT SUCCESS!!!<br>";


                        $_SESSION["SESSION_EMAIL"]= $user_name;
                        $_SESSION["SESSION_PASSWORD"]= $password;  

                        echo $_SESSION["SESSION_EMAIL"], "  ", $_SESSION["SESSION_PASSWORD"];

                        header("Refresh:0; url=website2.php");
                    }

                } 
                else echo "<br>FAIL!!!<br>";
            }
        ?>  
  

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

 <?php   
    session_start(); 
    if (session_status() == PHP_SESSION_ACTIVE) 
    {
        echo 'Session is active <br>';
    } else echo"session is ded";
    echo $_SESSION["SESSION_EMAIL"]; // it prints out an error if it screws up here
?>
  

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

1. Ваш запрос подразумевает, что ваши пароли являются обычным текстом, я бы их хэшировал, а также использовал подготовленную инструкцию. session_start обычно находится наверху, независимо от того, где вы фактически используете сеансы. Вы можете использовать Location: page вместо Refresh: , если планируете сохранить его в 0 . Вы должны exit() после заголовка.

2. Да, это сделано специально. Я просто хочу, чтобы это было в виде обычного текста, и я перейду к криптографии позже, когда узнаю больше о веб-дизайне и разработке.

3. Здесь что-то не так. При прочих равных условиях вы не можете вывести какое-либо содержимое до выполнения header вызова. Вы должны получать ошибки / предупреждения об этом.

4. В коде, который задает переменные, попробуйте поместить ваши session_start(); в самый верх файла сразу после <?php .

5. @waterloomatt, вероятно, сообщение об ошибке отключено.

Ответ №1:

Мне действительно неприятно это говорить, и я, честно говоря, чувствую, что мне следовало сделать это раньше, но после перезапуска моего сервера XAMPP и PHP, кажется, все исправилось само собой, и сеанс работает прямо сейчас. Теперь ничего не удаляется, и все переходы между страницами выполняются без усилий.

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

Еще раз, спасибо всем вам!

Ответ №2:

 <?php 
     session_start();
        include ("connection.php"); //connects to the database.

        if(isset($_POST['login'])) 
        {
            $user_name = $_POST['EMAIL'];
            $password = $_POST['PASSWORD'];

            // echo $user_name, " AND ", $password, "<br>";

            $q = "SELECT * FROM ".$table." WHERE EMAIL='".$user_name."' AND PASSWORD= '".$password."' AND IS_ADMIN= 'YES';";
            // echo "<br>",$q,"<br>";
            $r = mysqli_query($conn, $q); 

            if(mysqli_num_rows($r) > 0)
            {
                if(!isset($_SESSION["SESSION_EMAIL"])) 
                {
                    // session isn't started


                    echo "<br>GREAT SUCCESS!!!<br>";


                    $_SESSION["SESSION_EMAIL"]= $user_name;
                    $_SESSION["SESSION_PASSWORD"]= $password;  

                    echo $_SESSION["SESSION_EMAIL"], "  ", $_SESSION["SESSION_PASSWORD"];

                    header("Refresh:0; url=website2.php");
                }

            } 
            else echo "<br>FAIL!!!<br>";
        }
    ?>  
  

и на второй странице проверьте, нет ли чего-то подобного

 <?php   
session_start(); 
if (isset($_SESSION["SESSION_EMAIL"])) 
{
    echo 'Session is active <br>';
    echo $_SESSION["SESSION_EMAIL"];
} else echo"session is ded";
 // it prints out an error if it screws up here
?>
  

надеюсь, это поможет

или

Вы можете проверить наличие другой переменной сеанса

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

1. Я бы также добавил !empty($_SESSION[‘SESSION_EMAIL’]) к проверке «Сеанс активен»

2. да, может быть, bt это может привести к появлению уведомления без определения SESSION_EMAIL, когда эта переменная не установлена…

3. Хорошо, я сделал то, что вы предложили, но это только подтверждает, что сеансы удаляются после обновления, хотя этого не должно быть.

4. Как вы можете прочитать ниже в моем ответе, я устранил проблему, просто перезапустив все конфигурации моего сервера. В знак благодарности я полагаю, что выбор вашего ответа будет подходящей наградой за ваши усилия и извинит мою глупость. Спасибо!