出乎意料地丢失了会话数据

时间:2012-04-16 06:44:19

标签: php http session session-variables

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

// 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"]为空。

任何人都可以帮我吗?我做了什么'非法'这里吗?

注:

如果我在重定向之前{i}} ,那么它会返回变量。

当然,在我找回var_dump($_SESSION["foo"])之前,我总是打电话给session_start()

此外,我不知道这是否有事可做,但$_SESSION["foo"]是一个对象,所以我正在做$foo$foo = unserialize($_SESSION["foo"])。< / p>

1 个答案:

答案 0 :(得分:2)

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

  

会话破坏后跟会话启动似乎不再启动新会话。附加的代码适用于5.1.2但在5.1.4上失败。

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

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

可能的解决方法可能是将$foo变量作为$_GET参数传递到下一个脚本,如下所示:

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