我试图在登录用户之前杀死用户的上一个会话: 更多上下文,我想防止用户在不同的浏览器或位置使用相同的用户名/密码登录,阻止他们跨浏览器操纵会话状态(如游戏平衡)。
这是我到目前为止所做的,但没有成功1) 获取用户在成功登录时存储在数据库中的最后一个session_id,并将其保存在名为 $old_session_id 的变量中
2) 尝试使用以下代码删除最后一个会话
session_id($old_session_id);
session_start();
session_destroy();
3) 尝试使用 session_start() 为用户启动一个新的、干净的会话
我看到的是新会话没有启动 - 用户在两个浏览器上都注销了
任何帮助不胜感激!
客户端计算机上设置的 cookie 标识的 PHP 会话,并且 cookie 不会在浏览器之间共享。这不是问题。
#2 中的代码可能会将该用户的会话当前会话 ID 显式更改为先前浏览器中会话的 ID,这会导致您尝试解决的问题。
此外,每个请求只能调用一次 session_start(),因此 #3 当然会失败。
简而言之,只要停止做你在问题中提到的所有事情,你的问题就会自行解决。
一旦会话被销毁,就必须创建一个新会话。
如果您只想清除会话上的值,也可以尝试以下操作:
session_start();
$_SESSION = array(); //unset all session variables
session_regenerate_id创建新 ID。清除会话数据,重新生成 ID 并开始新的会话数据。
http://php.net/manual/en/function.session-regenerate-id.php
会话仅存储在您的浏览器中,因此,如果您想查看用户是否已登录其他浏览器,则需要使用数据库
向数据库添加状态为 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']);