【问题标题】:Deleting session variables in Safari causing errors在 Safari 中删除会话变量导致错误
【发布时间】:2014-06-20 02:05:50
【问题描述】:

我在 $_SESSION 数组中有三个变量:“views”、“user_id”和“username”。当用户注销时,“user_id”和“username”被删除。这在所有浏览器中都可以正常工作,在 Safari 中大约 75% 的时间。有时,它不是删除变量,而是将值“删除”给变量。这会使我的整个网站关闭,因为它基于变量是否已定义。

我删除变量的代码是:

unset($_SESSION["user_id"]);
unset($_SESSION["username"]);

$_SESSION = array();

session_destroy();

在 Safari 中,var_dump($_SESSION) 给出:

...
["user_id"] => string(7) "deleted"
["username"] => string(7) "deleted"
...

你知道为什么 Safari 会这样做吗?

【问题讨论】:

  • 你为什么打电话给session_destroy?只需使用unset() 就可以了。也许添加一个session_write_close() 以更好地衡量

标签: php session session-variables


【解决方案1】:

Safari 与该问题无关。会话在服务器端进行管理,所有 Safari(或任何浏览器)都与它有关的是保存带有 PHPSESSID 的 cookie。

您的问题是由于session_destroy。 (强调我的)

session_destroy() 销毁所有与 当前会话。 它不会取消设置任何全局变量 与会话关联,或取消设置会话 cookie。 要使用 再次会话变量,必须调用 session_start()。

为了完全终止会话,比如注销用户, 会话 ID 也必须取消设置。如果使用 cookie 来传播 会话 id(默认行为),则会话 cookie 必须是 删除。 setcookie() 可以用于此。

您的unset() 电话应该可以自己解决问题。你可以把它们组合起来

unset($_SESSION["user_id"], $_SESSION["username"]);

尝试添加session_write_close();,看看是否有不同。

如果失败,请尝试使会话 cookie 过期

$params = session_get_cookie_params();
setcookie(session_name(), '', time() - 42000,
    $params["path"], $params["domain"],
    $params["secure"], $params["httponly"]
);

【讨论】:

  • 那么你建议他改变什么?他在session_destroy()之前已经在使用unset()了,他还需要做什么?
  • 我删除了 session_destroy() 和 "$_SESSION = array(),我还添加了一行删除 PHPSESSID cookie。问题仍然存在。我应该在删除这些变量后立即提及, 我导航到另一个页面调用 session_start() 并重新创建 $_SESSION["Views"] 变量。我不知道这是否与它有关,但我想也许我之前开始会话它有时间被删除,如果可以的话。
  • 奇怪的是你的会话数据存储在服务器上。因此,您只需从$_SESSION 中删除数据即可。您总是可以使 cookie 过期(编辑答案以显示如何)
  • 这个,我忘了把 session_start() 放在文件的顶部。我接受了这个答案。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-15
  • 2014-09-13
  • 2012-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多