Переменная сеанса PHP существует, когда она не должна, и не существует, когда она должна - PullRequest
3 голосов
/ 21 октября 2019

Я работаю над своим собственным учебным проектом для удовольствия и последние несколько недель бьюсь головой о стену. У меня есть переменные сеанса, которые просто не существуют, когда они должны, и наоборот.

На «example.com/dashboard», $_SESSION['user'] существует, а затем при переходе на «example.com/app/list»"есть проверка оператора if, если она существует и установлена.

<?php
session_start();
if(!isset($_SESSION['user'])) {
    $_SESSION['errorMessage'] = "You are not logged in yet!";
    header('Location: /');
    exit;
}

Несмотря на то, что я проверил, что $_SESSION['user'] установлено на example.com/dashboard, оператор if возвращает false и выдает меня встраница входа.

* В моем случае страница входа - это мой index.php в корне моего сайта.

Теперь на этой странице входа вы должны бытьнемедленно перенаправляется на панель управления, если установлена ​​$_SESSION['user'].

<?php
session_start();
if(isset($_SESSION['user'])) {
    header('Location: /dashboard');
    exit();
}

Как я уже говорил, она установлена, но как-то нет. При обновлении он отправляет меня на панель инструментов (что должно произойти, если установлено $_SESSION['user'].)

Это проблема первая.

Теперь на "example.com/register",пока он не вошел в систему (сеанс был уничтожен при выходе из системы с использованием session_unset, session_destroy и т. д.), $_SESSION['user'] не существует. После нажатия на кнопку отправки, каким-то образом $_SESSION['user'] устанавливается на то, что было, когда вы вошли в систему. Абсолютно нигде нет фрагмента кода, который устанавливает $_SESSION['user'] на что-либо, кроме сценария входа в систему. На моей странице регистрации нет ничего, что позволило бы это. Это как если бы после выхода из системы сеанс был сохранен.

Код с моей корневой страницы, также называемый формой входа (index.php):

<?php
session_start();
if(isset($_SESSION['user'])) {
    header('Location: /dashboard');
    exit();
}

Код из dashboard.php:

<?php
session_start();
if(!isset($_SESSION['user'])) {
    $_SESSION['errorMessage'] = "You are not logged in yet!";
    header('Location: /');
    exit;
}

Код от моего logout.php (так как, возможно, придется что-то с этим делать):

<?php
session_start();
if(!isset($_SESSION['user'])) {
    $_SESSION['errorMessage'] = "You are not logged in yet!";
    header("Location: ../");
    die();
}
//clear session from globals
$_SESSION = array();
session_unset();
session_destroy();
unset($_SESSION);
header("Location: ../");
die;

На моем register.php:

<?php
session_start();
//register stuff ^^^^^
//eventually, mail to registerer
if (mail($to, $subject, $htmlContent, $headers)) {
     $connect->query($sqlInsert);
     $_SESSION['register_success'] = true;
     header("Location: https://example.com/register-success");
     exit;
}

Тогда на моемregister-success.php:

session_start();
if(!isset($_SESSION['register_success'])) {
    $_SESSION['errorMessage'] = "An error has occured, please try again.";
    header("Location: https://example.com/register");
    exit;
}

Имейте в виду, что всякий раз, когда я отправляю регистрацию, я получаю электронное письмо, поэтому $_SESSION['register_success'] должно быть установлено, но все равно выдает false в операторе if на example.com/register-success "

То, что я пробовал:

  • session_start(); в начале каждого сценария.
  • session_destroy(), session_unset(), $_SESSION = array(), unset($_SESSION) при выходе из системы, а затем их комбинация.
  • Проверка соответствия всех имен переменных сеанса, что я и сделал.

Iпонятия не имею, почему это происходит.

Заранее извиняюсь, если я объяснил это ужасно.

Спасибо, что прочитали.

1 Ответ

0 голосов
/ 21 октября 2019

Я бы сказал на странице выхода из системы, не должна ли она проверять, установлен ли сеанс для пользователя, а не установлен ли НЕ? Кроме того, я бы написал session_destroy внутри, как это. Этот код проверяет, существует ли переменная сеанса пользователя, а затем уничтожит сеанс. Затем сообщение об ошибке должно быть помещено на следующую страницу, на которую оно перенаправляет после session_start () ;. Я также не думаю, что вам понадобится что-то кроме session_destroy (), чтобы уничтожить сессию.

 <?php
 session_start();
 if(isset($_SESSION['user'])) {

    //clear session from globals 
    session_destroy();

    /* Added a Parameter */
    header("Location: ../?disperror=1");

 } else {
 header("Location: ../");
 } 

Я не уверен, что сообщение об ошибке будет установлено правильно. Возможно, вам придется иметь session_start ();на странице ../, когда он перенаправляет на эту страницу, затем установите переменную сеанса errorMessage после session_start. Поместите это на страницу ../ после session_start ();

    <?php 
    /* Should go on the Login page */
 session_start();

 /* Request the parameter */ 
 $disperror = $_REQUEST['disperror'];

 /* Establish Error Message */
 $errMsg = "You are not logged in yet!"; 

 /* Display this anywhere you want in PHP */
 if ($disperror == 1) {

    echo '<p>' . $errMsg . '</p>';

    /* If you want to turn that into a session variable only if the session was destroyed */
    $_SESSION['errorMessage'] = $errMsg;
 }
 ?>
...