PHP:删除给定ID的另一个会话

4
我有以下问题:
  1. 用户X在PC1登录,使用session_id 1000。 离开但忘记注销。
  2. 用户X在PC2登录,使用session_id 1001。
  3. 在session 1000超时之前,用户Y作为用户X在PC1上访问,使用session_id 1000。
这样,两个用户以相同的用户身份,在不同的计算机和不同的会话ID下获得访问权限。我想要做的是每次用户登录时存储新的session_id(已完成),并删除先前存储的session_id。但是我不知道如何在不更改当前会话的情况下删除或修改给定id的会话文件。 我的意思是,我想要执行以下操作:
  1. 用户X在PC1登录,使用session_id 1000。脚本将1000存储为last_session_id。 离开但忘记注销。
  2. 同一用户在PC2上登录,使用session_id 10001。脚本获取last_session_id(1000)并删除该会话信息;然后将1001存储为新的last_session_id。
  3. 用户Y使用session_id 1000去PC1,但无法使用X身份登录,因为信息已被删除。
* session_id(old_session)*能正常工作吗?还是该函数只重命名当前会话ID,但保持值不变?
提前感谢。

登录系统怎么样?我的意思是,用户和session_id之间的直接关系(例如:auth表数据库)。 - Somy A
我尽量避免在每次页面加载时读取表格以测试它是否为当前会话ID。如果我在登录时将其删除,则以后无需测试它。 - ESL
但是,如果用户和session_id之间没有关联,如何定义要销毁哪个session_id(与用户相关)? - Somy A
当用户登录时,脚本会将登录时间、用户ID和数据以及哈希(包括IP、浏览器等)保存为会话变量,并在表中保存新的会话ID。在覆盖会话ID之前,它会获取先前的ID。这个想法(我不知道如何实现)是始终删除先前的会话。因此,每次用户登录时,销毁先前的会话就像注销一样,无需每次查询数据库(只需从会话中获取值)。我不需要其他解决方案,我需要知道如何根据ID删除会话,就像标题所说的那样。谢谢。 - ESL
1
如果我理解正确,这回答了你的问题。 - Sirkong
@Sirkong 我认为这就是我需要的。虽然已经过去了一年半,但仍然如此... - ESL
2个回答

6

我找到了这个

$session_id_to_destroy = $sessionid;
// 1. commit session if it's started.
if (session_id()) {
    session_commit();
}

// 2. store current session id
session_start();
$current_session_id = session_id();
session_commit();

// 3. hijack then destroy session specified.
session_id($session_id_to_destroy);
session_start();
session_destroy();
session_commit();

// 4. restore current session id. If don't restore it, your current session will refer to the session you just destroyed!
session_id($current_session_id);
session_start();
session_commit();

对我来说,它完美地运行了。


2
答案归功于用户Jack Luo在php.net的这个帖子上。 - Zuul
1
谢谢@Zuul指出这一点。我肯定应该给予认可。 - Brenex

0
从我的经验来看,我使用一个表来存储与会话相关的数据。该表包含两个或更多字段:userID和lastSessionID。在您的系统中,只需要获取sessionId和userID,然后将其与存储在数据库中引用相同userID的最后一个sessionID进行比较。如果您获得了相同的sessionID,则继续,但如果不同,则重定向页面到注销。但是,要使用此方法,您应该在每次用户登录时将userID和sessionId保存到数据库中。

我尽量避免在每次页面加载时读取表格以测试它是否为当前会话ID。如果我在登录时将其删除,则以后无需测试它。 - ESL
每次页面加载时,只需读取数据库即可获取特定用户的最新sessionId。在数据库中,一个用户只有一个sessionId。 - errorare
我正在尝试避免重复的数据库读取。PHP的会话系统允许有多个会话指向同一网页用户(相同的用户ID)。我不需要读取数据库来获取会话ID。当页面加载时,加载$_SESSION ['uid']。但如果用户没有注销,另一个用户(具有先前会话的用户)可能会拥有先前的$ _SESSION ['uids'],脚本不知道这是否是最后一个。所以我尝试删除旧的。 - ESL
你是不是想用 session_destroy(); ?session_destroy 将会完全销毁之前使用的所有会话。销毁后,你可以为新用户分配新的会话。 - errorare
我尝试使用session_destroy(),但是销毁了当前会话,而不是上一个会话。 - ESL

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接