2013-07-29 86 views
2

我的网站使用会话进行用户登录,我想有显示用户多台计算机是如何登录到他们的账户(如Gmail做什么)每个页面上的消息。

例如,如果它们都记录在两个不同的计算机上,我想消息说:

You are logged in on 2 computers. 

我知道如何检查自己是否登录 - 我只是检查$_SESSION['username']变量如果它被设置,那么他们在该计算机上登录。但是我怎样才能检查是否在其他会话中设置了相同的username(表示它们已在其他计算机上登录)?

+1

否。通过数据库管理您自己的会话。 (1.生成随机字符串,2.将其设置为cookie,3。将它保存在数据库中,使用引用的表(user_id-> id)) –

+0

您需要将会话数据存储在数据库中。 – rtimoshenko

+1

@DaveChen - 如果用户检查复选框以保持登录状态,我确实会存储cookie,但是如果我在数据库中存储了某些用户仅使用会话进行登录(即无持久登录)的情况,那么如何更新数据库何时会话结束?没有办法知道会话何时结束,对吧? – Nate

回答

2

这是很难与基于默认的文件PHP会话执行。默认情况下,PHP只是将会话信息存储在文件系统文件中的不透明blob中,文件名称为会话ID。您无法直接访问这些文件中的数据,而无需逐一打开并评估它们。

你需要的是将这些信息转移到一个数据库中。要么只存储数据库中的并发登录数并按原样保存其他会话,但很难保持同步。切换到会话的完整数据库后端代替基于文件的存储会更好。这使您可以透明地查询会话中的任何数据,包括轻松获取有关用户拥有多少会话的统计信息。

2

你会想会话数据存储在数据库中。然后,您可以查询数据库是否有多个具有相同ID的用户。

+1

有用的代码片段存储会话在数据库 - http://phpsecurity.org/code/ch08-2 –

0

刚刚创建的用户表登录计数一个额外的列。当用户登录到服务器1个计数增加列当用户注销与1数减少...

通过会话都为每个浏览器创建的方式..你不能访问其他会话变量会话

+0

如何做你处理自动垃圾收集会话......? – deceze

1

注:我不会逃避例子中的数据,但你需要做的与库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';