PHP会话在刷新时重置

时间:2015-04-07 07:04:24

标签: php session

我一直试图在网上搜索这个问题的可能答案,但我真的无法弄明白。有很多人有类似的问题,但我有一个独特的触摸,我不明白,我也没有在其他任何地方遇到它。

我创建了一个工作正常的登录系统。但是,我想让它更安全,所以我使用了本教程:http://www.wikihow.com/Create-a-Secure-Login-Script-in-PHP-and-MySQL。我仍然可以登录,但每当我刷新页面时,我都会自动注销。在我发现会话ID发生变化之后。

奇怪的是,当我调用var_dump($ _ SESSION)时;在我的代码的第3行(直接在session_start();)之后,会话ID保持不变,一切正常。一旦我评论这一行,问题就会回来。

我使用以下代码重新生成会话ID:

$session_name = 'robinator123';   // Set a custom session name
$secure = FALSE;
// This stops JavaScript being able to access the session id.
$httponly = true;
// Forces sessions to only use cookies.
if (ini_set('session.use_only_cookies', 1) === FALSE) {
    header("Location: ../error.php?err=Could not initiate a safe session (ini_set)");
    exit();
}
// Gets current cookies params.
$cookieParams = session_get_cookie_params();
session_set_cookie_params($cookieParams["lifetime"],
    $cookieParams["path"], 
    $cookieParams["domain"], 
    $secure,
    $httponly);
// Sets the session name to the one set above.
session_name($session_name);
session_start();            // Start the PHP session 
session_regenerate_id(true);    // regenerated the session, delete the old one. 

当我调用var_dump($ _ SESSION);时,再生失败,因为var_dump已经发送了头文件。但是,当我用正常的echo语句替换var_dump时,标头也会失败,但会话ID仍会更改。我不知道发生了什么。

一些注意事项:

  • 我没有忘记调用session_start();在我的代码的开头
  • 我用来存储会话变量的包含的php代码位于我的web根目录之外,但是如果我把它们放回到我的root中,问题就不会解决,所以我猜测它可以&#39是问题。

1 个答案:

答案 0 :(得分:0)

我实际上是通过编辑再生代码解决了这个问题。删除再生不起作用,但我通过设置我忘记更改的参数(即生命周期,路径和域),并通过删除参数" true"来修复它。来自session_regenerate_id();命令(我从教程中复制粘贴此代码,并且在进行所有更改时未能注意到这些内容)。

但是,我仍然非常好奇var_dump是如何避免这个问题的。