跨浏览器:PHP终止会话

跨浏览器:PHP终止会话,php,session,sessionid,Php,Session,Sessionid,我试图在用户登录之前杀死他们的上一个会话:更多上下文,我想阻止用户在不同浏览器或位置使用相同的用户名/密码登录,阻止他们在浏览器之间操纵会话状态(如游戏的平衡) 这是我迄今为止所做的,但没有成功 1) 获取用户成功登录时存储在数据库中的最后一个会话\u id,并将其保存在名为$old\u session\u id的变量中 2) 尝试使用以下代码删除最后一个会话 session_id($old_session_id); session_start(); session_destroy(); 3)

我试图在用户登录之前杀死他们的上一个会话:更多上下文,我想阻止用户在不同浏览器或位置使用相同的用户名/密码登录,阻止他们在浏览器之间操纵会话状态(如游戏的平衡)

这是我迄今为止所做的,但没有成功 1) 获取用户成功登录时存储在数据库中的最后一个会话\u id,并将其保存在名为$old\u session\u id的变量中

2) 尝试使用以下代码删除最后一个会话

session_id($old_session_id);
session_start();
session_destroy();
3) 尝试使用会话_start()为用户启动新的干净会话

我看到的是,新会话没有启动-用户在两个浏览器上都已注销


感谢您的帮助

由客户端机器上的cookie集标识的PHP会话,浏览器之间不共享cookie。这不是问题

#2中的代码可能会将该用户的会话当前会话ID显式更改为上一个浏览器中的会话ID,这将导致您试图解决的问题

此外,每个请求只能调用会话_start(),因此当然#3会失败


简而言之,只要停止做你在问题中提到的一切,你的问题就会自行解决。

一旦会话被破坏,就必须创建一个新会话

如果您只想清除会话中的值,还可以尝试以下操作:

session_start();
$_SESSION = array(); //unset all session variables

会话仅存储在浏览器中,所以如果您希望查看用户是否已登录到其他浏览器,则需要使用数据库

向数据库中添加状态为1或0的行

1=“在线”

0=“离线”

在您的登录页面中,如果1,请检查用户状态

$query=mysql_query("select status from table_name were username=$_POST['username']");
$status=$query['status'];
if($status == 1)
{
redirect him to a page saying the account is already logged in
}else
{
let him in and update the database status = 1
}
在注销页面时 将用户状态更新为0使其脱机

如果您只想删除所有会话,请使用 在销毁之前先使用会话启动,然后再使用会话启动,因为不启动会话就无法销毁会话

session_start();
session_destroy();
session_start();
但是,如果要删除特定会话,则需要使用

unset($_SESSION['sessionname']);

您可以使用会话重新生成id来创建新id。 清除会话数据,重新生成id并启动新会话