我的网站使用会话进行用户登录,我想有显示用户多台计算机是如何登录到他们的账户(如Gmail做什么)每个页面上的消息。
例如,如果它们都记录在两个不同的计算机上,我想消息说:
You are logged in on 2 computers.
我知道如何检查自己是否登录 - 我只是检查$_SESSION['username']
变量如果它被设置,那么他们在该计算机上登录。但是我怎样才能检查是否在其他会话中设置了相同的username
(表示它们已在其他计算机上登录)?
我的网站使用会话进行用户登录,我想有显示用户多台计算机是如何登录到他们的账户(如Gmail做什么)每个页面上的消息。
例如,如果它们都记录在两个不同的计算机上,我想消息说:
You are logged in on 2 computers.
我知道如何检查自己是否登录 - 我只是检查$_SESSION['username']
变量如果它被设置,那么他们在该计算机上登录。但是我怎样才能检查是否在其他会话中设置了相同的username
(表示它们已在其他计算机上登录)?
这是很难与基于默认的文件PHP会话执行。默认情况下,PHP只是将会话信息存储在文件系统文件中的不透明blob中,文件名称为会话ID。您无法直接访问这些文件中的数据,而无需逐一打开并评估它们。
你需要的是将这些信息转移到一个数据库中。要么只存储数据库中的并发登录数并按原样保存其他会话,但很难保持同步。切换到会话的完整数据库后端代替基于文件的存储会更好。这使您可以透明地查询会话中的任何数据,包括轻松获取有关用户拥有多少会话的统计信息。
你会想会话数据存储在数据库中。然后,您可以查询数据库是否有多个具有相同ID的用户。
有用的代码片段存储会话在数据库 - http://phpsecurity.org/code/ch08-2 –
刚刚创建的用户表登录计数一个额外的列。当用户登录到服务器1个计数增加列当用户注销与1数减少...
通过会话都为每个浏览器创建的方式..你不能访问其他会话变量会话
如何做你处理自动垃圾收集会话......? – deceze
注:我不会逃避例子中的数据,但你需要做的与库MySQLi或PDO
像这样的一些列创建一个表logged_in_users
或类似的东西:
create table logged_in_users(
user_id int unsigned,
login_date datetime,
hash_key char(32),
unique key user_hash_key(user_id, hash_key)
);
当用户登录时,删除旧记录,然后添加新的成员如下:
$hash_key = md5(time().uniqid().rand(0,1000)); // Create a unique key
$_SESSION["hashkey"] = $hash_key;
// Remove the inactive members (this uses 10 minutes)
delete from logged_in_users where login_date > date_sub(now(), interval 10 minute);
// Add the user
insert ignore into logged_in_users (user_id, login_date, hash_key) values (123, now(), '$hash_key');
而当用户加载页面,你应该检查,看看用户是否仍然有记录,并插入一个当你想知道有多少人都记录在
$hash_key = $_SESSION["hashkey"];
insert ignore into logged_in_users (user_id, login_date, hash_key) values (123, now(), '$hash_key');
然后,你会做这样的事:如果他/她不喜欢这个
// Total people for a particular member
select count(*) as total from logged_in_users where user_id = 123;
// Total people logged in
select count(*) as total from logged_in_users;
// Total members logged in (not people)
select count(distinct user_id) as total from logged_in_users;
最后当用户注销时,像这样删除它们:
$hash_key = $_SESSION["hashkey"];
delete from logged_in_users where user_id = 123 and hash_key = '$hash_key';
否。通过数据库管理您自己的会话。 (1.生成随机字符串,2.将其设置为cookie,3。将它保存在数据库中,使用引用的表(user_id-> id)) –
您需要将会话数据存储在数据库中。 – rtimoshenko
@DaveChen - 如果用户检查复选框以保持登录状态,我确实会存储cookie,但是如果我在数据库中存储了某些用户仅使用会话进行登录(即无持久登录)的情况,那么如何更新数据库何时会话结束?没有办法知道会话何时结束,对吧? – Nate