PHP会话变量在不应该存在时存在,在不应该存在时不存在

时间:2019-10-21 13:38:18

标签: php session session-cookies session-variables

我正在为自己的学习项目而工作,很有趣,并且在过去的几周里,我一直在撞墙。我有会话变量,它们在应该存在时根本不存在,反之亦然。

在“ 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;
}

即使我在example.com/dashboard上验证了$_SESSION['user']的设置,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'],但是在“ example.com/register-success”上的if语句上仍然会抛出错误。

我尝试过的事情:

  • session_start();在每个脚本的开头。
  • session_destroy()session_unset()$_SESSION = array()unset($_SESSION),然后将其全部合并。
  • 检查所有会话变量名称是否匹配,直到我确定 要做。

我绝对不知道为什么会这样。

如果我已经做了非常详尽的解释,请提前道歉。

感谢您阅读。

1 个答案:

答案 0 :(得分:-1)

我要在注销页面上说,它不应该检查是否为用户会话设置为IS而不是未设置吗?另外,我会这样写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: ../");
 } 

我不确定此errorMessage是否设置正确。您可能必须具有session_start();在../页面上重定向到该页面时,请在session_start之后设置errorMessage会话变量。将其放在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;
 }
 ?>