我现在已经两次了。出乎意料的是,我的登录系统停止工作,通过调试我发现$ _SESSION变量在登录过程中无法生存。然后,没有明显的原因,它恢复工作。这是流程:
index.html
,表单提交至login.php
; login.php
执行基本的健全性,isset和空检查,然后使用数据库检查凭据。如果电子邮件地址和密码正确(即存在于数据库中),请将其放入$_SESSION
变量并将用户重定向到home.php
。home.php
检索$_SESSION
个变量。这里失败了。第二次(几分钟前)我阅读了更多关于它的信息并发现了一个论坛帖子我以前没有读过它(当会话变量再次工作时我停止阅读它)说你需要有在<?php
之前<?
代替session_start();
。我试过了,没想到它会起作用,但是当我登录后,直接更改后(这是我唯一改变的AFAIK)它起作用了。找到原因?将<?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 in\n");
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()
函数是唯一可以执行该操作的地方。)
答案 0 :(得分:0)
在脚本结束的所有位置尝试session_write_close();
,例如exit;
die();
和页面结束。
答案 1 :(得分:0)
我发现这是一个特定于浏览器的问题。我认为这是由谷歌Chrome引起的,因为一旦我使用移动版Safari或Mozilla Firefox来测试会话,它就会消失。虽然在高级设置中我可以看到PHPSESSID
cookie,但它没有取回会话。
我错了。 Mozilla也开始放弃会议。删除会话(session_destroy()
)后,它再次起作用。所以我的猜测是,在服务器上的会话到期后,浏览器仍然有PHPSESSID
cookie。如果它将它发送到服务器,服务器找不到会话,只是在$_SESSION
中放入一个空数组,让我一无所知。我希望这有助于有人遇到同样的问题。