【发布时间】:2013-05-04 00:16:45
【问题描述】:
我已经吃过两次了。出乎意料的是,我的登录系统停止工作,通过调试我发现 $_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() 函数是唯一这样做的地方。)
【问题讨论】:
-
如果你提供你的代码sn-p,它可能很容易理解你的问题。
-
您的浏览器可能会导致此问题,例如它可能会丢失 cookie 来跟踪您的会话。某些防病毒软件或某些东西可能会导致此问题。好吧,一个快速测试是在其他系统上尝试相同的站点,同时也在其他网络上尝试。
标签: php session session-variables