2

我已经吃过两次了。出乎意料的是,我的登录系统停止工作,通过调试我发现 $_SESSION 变量在登录过程中无法生存。然后,在没有明显原因的情况下,它恢复工作。这是流程:

  1. 用户登录index.html,表单提交login.php
  2. login.php进行基本的健全性、isset 和空检查,然后使用数据库检查凭据。如果电子邮件地址和密码正确(即存在于数据库中),则将它们放入$_SESSION变量中并将用户重定向到home.php.
  3. 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()函数是唯一这样做的地方。)

4

2 回答 2

0

我发现这是一个特定于浏览器的问题。我认为这是由 Google Chrome 引起的,因为一旦我使用移动 Safari 或 Mozilla Firefox 测试会话,它就会消失。尽管在高级设置中我可以看到PHPSESSIDcookie,但它并没有获取会话。

重要编辑

我错了。Mozilla 也开始放弃会话。在我删除会话 ( session_destroy()) 后,它再次起作用。所以我的猜测是,在服务器上的会话过期后,浏览器仍然有PHPSESSIDcookie。如果将其发送到服务器,则服务器找不到会话,只是将一个空数组放入$_SESSION,让我一无所知。我希望这可以帮助遇到同样问题的人。

于 2013-05-14T08:44:31.053 回答
0

在脚本结束和页面结束session_write_close();的所有地方尝试。exit; die();

于 2013-05-10T13:19:17.077 回答