我已经经历过两次这样的事了。突然,我的登录系统停止工作,通过调试我发现 $_SESSION 变量在登录过程中无法生存。然后,在没有明显原因的情况下,它会恢复工作。这是流程:
- 用户登录于
index.html
, 表单提交至login.php
;
-
login.php
进行基本的健全性、isset 和空检查,然后使用数据库检查凭据。如果电子邮件地址和密码正确(即存在于数据库中),请将它们放入$_SESSION
变量并将用户重定向到home.php
.
-
home.php
检索$_SESSION
变量。这里失败了。
第二次(几分钟前)我阅读了更多有关它的信息,并发现了一个我上次没有读过的论坛主题(当会话变量再次起作用时我停止阅读它),其中说您需要<?php
代替<?
before session_start();
。我尝试了它,没想到它会起作用,但是当我登录时,在更改它之后(这是我唯一改变的 AFAIK)它就起作用了。原因找到了吗?更改后我们检查一下<?php
回到<?
。它仍然有效。造成这种情况的原因是什么?如何预防(或者,如果无法预防,则检测发生了什么)?
Edit:
有趣的是:我有一个小实用函数来检查用户是否登录:
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
. The assertUserLogin()
function 是唯一执行此操作的地方。)
Try session_write_close();
在脚本结束的所有地方,例如exit;
die();
和页尾。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)