【问题标题】:Unexpectedly losing session data意外丢失会话数据
【发布时间】:2012-04-16 06:44:19
【问题描述】:

所以,我想在用户注销后保留一个特定的会话变量。像这样:

// Save the session variable
$foo = $_SESSION["foo"];

// Terminate the session
//----------------------------------------------
if (ini_get("session.use_cookies")) {
    $params = session_get_cookie_params();
    setcookie(session_name(), "", time() - 3600,
        $params["path"], $params["domain"],
        $params["secure"], $params["httponly"]
    );
}

session_destroy();
session_regenerate_id();
//----------------------------------------------

// Restart the session
session_start();

// Store the variable in the session
$_SESSION["foo"] = $foo;

// Redirect the user to the same page, this time unauthenticated
header("Location: " . $_SERVER["REQUEST_URI"]);

但似乎没有正确存储,因为重定向后,$_SESSION["foo"] 为空。

谁能帮我解决这个问题?我在这里做“非法”的事情吗?

注意:

如果我 var_dump($_SESSION["foo"]) 正确重定向之前,它确实会返回变量。

当然,我总是先调用session_start(),然后再检索$_SESSION["foo"]

还有,我不知道这是否有关系,但$foo 是一个对象,所以我在做$foo = unserialize($_SESSION["foo"])$_SESSION["foo"] = serialize($foo);

【问题讨论】:

  • 您声明您正在“重新启动会话”,但您是否启动过它? session_start() 不会自动启动。
  • Emm 不确定我是否在关注。该会话之前已启动,我结束它,然后使用session_start() 再次启动它。我不知道我是否可以在同一个脚本中做这两件事,这就是我问的原因
  • 在调用 session_start() 之前有没有输出任何东西?这会干扰设置会话 cookie。检查你的标题。
  • @JohnDoe 那么,原因可能是矫枉过正?为什么不直接取消设置不需要的会话并(如果确实需要)重新生成会话 ID?你正在做的事情似乎非常具有破坏性。
  • DavidChan:不,我没有输出任何东西(除了我曾经用来检查变量中是否有任何东西的 var_dump)。 @Repox 我不知道,如果我不重新生成会话 ID,我认为这不会有什么不同。也许这是一个像 Michal 说的错误

标签: php http session session-variables


【解决方案1】:

根据您使用的 PHP 版本,也许这可以解释问题https://bugs.php.net/bug.php?id=38042

会话销毁然后会话开始似乎不再启动新会话。附加代码适用于 5.1.2,但在 5.1.4 上失败。

也许其他版本也可能受到影响。

这篇文章还描述了您遇到的行为:

一种可能的解决方法是将$foo 变量作为位置标头中的$_GET 参数传递给您的下一个脚本,如下所示:

header("Location: " . $_SERVER["REQUEST_URI"] . "?foo=" . $foo);

【讨论】:

  • 啊,这几乎解释了发生了什么。这和我有同样的问题。谢谢!
  • 我想到了解决方法,问题是$foo 是一个对象,所以我会变得很乱。无论如何我都会尝试或只是更改 PHP 版本
  • @Michal 乞求支持通常不会给你任何帮助。让我们根据您的回答来决定您是否应得。
  • @Repox - 注意它后面的:)...只是个玩笑;)今天开玩笑的心情...(如果您觉得不合适,请见谅)...顺便说一句,我注意到您同意有了答案……
猜你喜欢
  • 2013-04-14
  • 2014-12-05
  • 2018-01-27
  • 1970-01-01
  • 2013-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-13
相关资源
最近更新 更多