【问题标题】:Destroy all sessions but one销毁除一个以外的所有会话
【发布时间】:2015-03-21 14:53:21
【问题描述】:

我和这个人有同样的问题:Destroy session, but keep one variable set(已解决)

当用户注销时,我正在尝试销毁/取消设置除一个名为“id”的会话之外的所有会话。 我不想手动取消设置每个会话,因为我有很多会话。

这是我的 logout.php

<?php
session_start();
foreach($_SESSION as $key=>$value) {
if($key !== "id") {
     unset($_SESSION[$key]);
}
}
header("Location: login.php");
exit;
?>

此代码当前取消设置所有会话并且不保留名为 ID 的会话。

我错过了什么?

【问题讨论】:

  • 您确定您的值存储在$_SESSION['id'] 中吗?
  • 做 print_r($_SESSION);在 foreach 循环之前检查键 => 值与您期望的一样。
  • IDid 不一样,如果是这样的话。
  • @Martin 我 100% 确定该值存储在 $_SESSION['id'] 中。
  • 那么您的示例代码中的逻辑应该可以工作。 :-/

标签: php session-cookies


【解决方案1】:

您可以重新分配$_SESSION['id'],而不是删除所有其他人。

一个小技巧:)

<?php
session_start();
$tmp = $_SESSION['id'];
session_unset();
$_SESSION['id'] = $tmp;

header("Location: login.php");
exit;
?>

【讨论】:

  • 伙计,我真的很爱你,我不知道为什么这会奏效,而我的例子却没有。对我来说没有意义,但谢谢你的回答!
  • @DennisEnström 享受 PHP 吧:) 其实你也可以试试 $key != "id" 而不是 $key !== "id"
  • 我也试过了,但 $_SESSION['id'] 包含一个令牌,所以我想检查它是否“不完全相同”而不是“不相等”,但也许我在这里也错了? ^^
【解决方案2】:

你也可以这样做:

$keep_alive = $_SESSION['id'];

销毁所有会话:

session_start();
session_destroy();

再次设置会话:

session_start();
$_SESSION['id'] = $keep_alive;

【讨论】:

  • 使用这种方法,我必须启动会话两次吗?会话在 session_destroy() 之前已经开始;
  • 我想。你不需要。我不确切知道。这就是我在这里重新开始的原因。
猜你喜欢
  • 2013-06-17
  • 2019-04-14
  • 1970-01-01
  • 1970-01-01
  • 2017-11-13
  • 2012-08-23
  • 2011-11-25
  • 1970-01-01
  • 2017-09-11
相关资源
最近更新 更多