代码之家  ›  专栏  ›  技术社区  ›  wohe1

$会话变量在设置为空之前为空

  •  1
  • wohe1  · 技术社区  · 8 年前

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

    我用超全球 $_SESSION['recent'] 用于在我的网页上创建通知。例如,如果用户试图登录,但给出了错误的密码,则登录表单会将其数据发送到文件 login.php 它检查所有数据是否正确。如果数据正确,它将设置 $_SESSION['recent'] = 'login_succes' (以及其他一些东西,以便用户登录),否则它将设置 $_SESSION['recent'] = 'login_fail' . 接下来它将返回到主页 header('location: http://www.example.com/') .

    在这个主页上,有一大块 菲律宾比索 用一个 switch 检查所有可能的 $会话[“最近的”] 值,并根据其值发出警报。这段代码看起来有点像这样(我使用bootstrap):

    <?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 所以这条信息不会一直显示出来。

    然而 ,这就是问题所在:这适用于前3个案例( logout , login_succes login_fail ),但对于所有其他情况,警报不会显示, 除非 我删除了这一行 $_SESSION['recent'] = null; (显然我不想删除,因为这样在重新加载时,警报消息将继续显示)。

    有人知道是什么引起的,以及如何解决这个问题吗?如果你需要更多的信息,尽管问。

    谢谢!

    2 回复  |  直到 8 年前
        1
  •  1
  •   Dmytro Zasiadko    8 年前

    你所发布的代码看起来应该如你所期望的那样工作。很可能问题出在外面。要确保您有权访问会话值并在脚本完成时清除它,可以执行以下操作

    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
      }
      
        2
  •  0
  •   wohe1    8 年前

    所以我找到了我自己的解决方案(所有这些对我都不起作用……):

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

    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();
    }