$_SESSION 变量在我将其设置为 null 之前为 null
$_SESSION variable is null before I set it to null
我在我正在构建的网站的 php
代码中遇到了一个奇怪的问题:
我使用超全局 $_SESSION['recent']
在我的网页上创建警报。例如,如果用户尝试登录,但输入了错误的密码,登录表单会将其数据发送到文件 login.php
,该文件会检查所有数据是否正确。如果数据正确,它会设置 $_SESSION['recent'] = 'login_succes'
(以及其他一些让用户登录的东西),否则它会设置 $_SESSION['recent'] = 'login_fail'
。接下来它将 return 到主页 header('location: http://www.example.com/')
.
在这个主页中,有一大块 php
代码和 switch
语句检查所有可能的 $_SESSION['recent']
值并根据其值发出警报。这段代码看起来有点像这样(我使用 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">×</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">×</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;
(我显然不想删除,因为那样警报消息将重新加载时继续显示)。
有谁知道是什么原因造成的以及如何解决这个问题?如果您需要更多信息,请提出要求。
谢谢!
您发布的有问题的代码看起来应该可以按预期工作。问题很可能出在外面的某个地方。为了确保您可以访问会话值并在脚本完成后将其清除,您可以这样做
添加包含以下内容的文件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];
}
}
在需要检查的地方,添加下一段代码
<?php
require_once('FlashMessages.php');
$flashMessages = new FlashMessages();
switch ($flashMessages->getMessage('recent')) {
//...your code goes here
}
所以我找到了自己的解决方案(以上所有方法都不适合我...):
在我的代码中,我会检查这样的错误:
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();
}
我在我正在构建的网站的 php
代码中遇到了一个奇怪的问题:
我使用超全局 $_SESSION['recent']
在我的网页上创建警报。例如,如果用户尝试登录,但输入了错误的密码,登录表单会将其数据发送到文件 login.php
,该文件会检查所有数据是否正确。如果数据正确,它会设置 $_SESSION['recent'] = 'login_succes'
(以及其他一些让用户登录的东西),否则它会设置 $_SESSION['recent'] = 'login_fail'
。接下来它将 return 到主页 header('location: http://www.example.com/')
.
在这个主页中,有一大块 php
代码和 switch
语句检查所有可能的 $_SESSION['recent']
值并根据其值发出警报。这段代码看起来有点像这样(我使用 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">×</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">×</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;
(我显然不想删除,因为那样警报消息将重新加载时继续显示)。
有谁知道是什么原因造成的以及如何解决这个问题?如果您需要更多信息,请提出要求。
谢谢!
您发布的有问题的代码看起来应该可以按预期工作。问题很可能出在外面的某个地方。为了确保您可以访问会话值并在脚本完成后将其清除,您可以这样做
添加包含以下内容的文件
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]; } }
在需要检查的地方,添加下一段代码
<?php require_once('FlashMessages.php'); $flashMessages = new FlashMessages(); switch ($flashMessages->getMessage('recent')) { //...your code goes here }
所以我找到了自己的解决方案(以上所有方法都不适合我...):
在我的代码中,我会检查这样的错误:
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();
}