我已经吃过两次了。出乎意料的是,我的登录系统停止工作,通过调试我发现 $_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()
函数是唯一这样做的地方。)