$ _SESSION变量为空,然后将其设置为null

时间:2018-07-29 07:34:32

标签: php switch-statement session-variables

在我正在建立的网站的php代码中,我遇到了一个奇怪的问题:

我使用超全局$_SESSION['recent']在我的网页上创建警报。例如,如果用户尝试登录但输入了错误的密码,则登录表单会将其数据发送到文件login.php中,该文件将检查所有数据是否正确。如果数据正确,它将设置$_SESSION['recent'] = 'login_succes'(以及其他一些使用户登录的信息),否则它将设置$_SESSION['recent'] = 'login_fail'。接下来,它将以header('location: http://www.example.com/')返回首页。

在此主页中,有一大堆php代码和一条switch语句,该语句检查所有可能的$_SESSION['recent']值,并根据其值发出警报。这段代码看起来像这样(我使用引导程序):

<?php switch ($_SESSION['recent']) { ?>
<?php case 'logout': ?>
<div class="container-fluid alert-fixed"><div class="alert alert-success alert-dismissible">
    <button type="button" class="btn close" data-dismiss="alert">&times;</button>
    You are signed out.
</div></div>
<?php break; case 'login_succes': ?>
<div class="container-fluid alert-fixed"><div class="alert alert-success alert-dismissible">
    <button type="button" class="close" data-dismiss="alert">&times;</button>
    You are signed in
</div></div>
<?php break; case 'login_fail': ?>
... (similar alert message)
<?php break; case 'not_loggedin': ?>
...
<?php break; case 'admin_change_succes': ?>
...
<?php break; case 'admin_change_fail': ?>
...
<?php break; } $_SESSION['recent'] = null; ?>

所以我希望它能做的是检查所有通知,并在必要时显示警报消息。完成此操作后,它将设置$_SESSION['recent'] = null,以便此消息不会一直显示。

但是,这是问题所在:这适用于前三种情况(logoutlogin_succeslogin_fail),但对于所有其他情况,则不会显示警报,除非,否则我将删除$_SESSION['recent'] = null;行(我显然不想删除,因为警报消息将在重新加载时继续显示)。 / p>

有人知道这是什么原因以及如何解决该问题吗?如果您需要更多信息,请提出要求。

谢谢!

2 个答案:

答案 0 :(得分:1)

您有问题的代码看起来应该可以按预期工作。问题很可能出在外面。为了确保您有权访问会话值并在脚本完成后将其清除,您可以执行以下操作

  1. 添加具有以下内容的文件FlashMessages.php

    <?php
    class FlashMessages {
        private static $messages;
        private static $sessionStarted = false;
    
        public function __construct() {
            if (!self::$sessionStarted) {
                session_start();
                self::$sessionStarted = true;
            }
        }
    
        public function getMessage($name) {
            if (!array_key_exists($name, self::$messages)) {
                self::$messages[$name] = array_key_exists($name, $_SESSION) ? $_SESSION[$name] : null;
                unset($_SESSION[$name]);
            }
    
            return self::$messages[$name];
        }
    }
    
  2. 在需要检查的地方,添加下一个代码

    <?php
    require_once('FlashMessages.php');
    $flashMessages = new FlashMessages();
    switch ($flashMessages->getMessage('recent')) {
        //...your code goes here
    }
    

答案 1 :(得分:0)

所以我找到了自己的解决方案(以上所有方法都不适合我...):

在我的代码中,我将检查以下错误:

if (!$_SESSION['uid'] or !$_SESSION['login']) {
    $_SESSION['recent'] = 'not_loggedin';
    header('location: http://my.domain.com/');
}

但是,在该块之后还有很多其他代码。我以为header语句将阻止以下代码的执行,但事实并非如此,将代码更改为以下代码对我有用:

if (!$_SESSION['uid'] or !$_SESSION['login']) {
    $_SESSION['recent'] = 'not_loggedin';
    header('location: http://my.domain.com/');
    die();
}