我已经经历过两次了。突然,我的登录系统停止工作了,通过调试,我发现$_SESSION变量在登录过程中失效了。然后,没有明显的原因,它又开始工作了。下面是流程:
- 用户在
index.html
登录,表单提交给login.php
; -
login.php
做基本的健全,isset和空检查,然后检查凭据与数据库。如果电子邮件地址和密码是正确的(即数据库中存在),则将其放在$_SESSION
变量中,并将用户重定向到home.php
。 -
home.php
检索$_SESSION
变量。
第二次(几分钟前)我读了更多关于它,发现一个论坛线程,我没有读过以前发生的事情(当会话变量再次工作时,我停止阅读它),它说你需要在session_start();
之前有<?php
而不是<?
。我尝试了它,并不期望它能工作,但当我登录后,直接改变(这是我唯一改变的东西),它工作了。导致发现?让我们在将<?php
更改回<?
后进行检查。它仍然有效。造成这种情况的原因是什么,我该如何预防它(或者,如果无法预防,就检测发生了什么)?
编辑:
有趣的是:我有一个小的实用功能来检查用户是否登录:
function assertUserLogin() {
try {
$user = new User($_SESSION['email'], $_SESSION['pwd']);
} catch(Exception $ex){
writeToLog("Exception: " . $ex->getMessage());
header("Location: http://www.korilu.nl/maurits/anw?requested:" . $_SERVER["REQUEST_URI"]);
}
writeToLog($user->email . " logged inn");
return $user;
}
所以我可以这样写:
<?
session_start();
$user = assertUserLogin();
?>
用户需要在每个页面上登录。这里有趣的是,如果它失败了(如上所述),它调用我的函数writeToLog()
(log()
已经被PHP标准库采用了):
function writeToLog($string) {
$log = fopen("log.txt", "w");
fwrite($log, $string);
fclose($log);
}
非常简单。但原木仍然是空的。(我确信函数writeToLog()
被调用,因为我被重定向到http://www.korilu.nl/maurits/anw?requested:/maurits/anw/home.php
。assertUserLogin()
函数是唯一可以这样做的地方。)
在脚本结束的所有地方尝试session_write_close();
,如exit;
、die();
和页面结束
我发现这是浏览器特有的问题。我认为这是由Google Chrome造成的,因为只要我使用移动Safari或Mozilla Firefox测试会话,它就会消失。虽然在高级设置中我可以看到PHPSESSID
cookie,但它没有拾取会话。
session_destroy()
)之后,它再次工作了。所以我的猜测是,会话在服务器上过期后,浏览器仍然有PHPSESSID
cookie。如果它将其发送到服务器,服务器无法找到会话,只是在$_SESSION
中放置一个空数组,让我无能为力。我希望这能帮助到有同样问题的人。
标题>