我的网站使用会话进行用户登录,我希望每个页面都显示一条消息,向用户显示登录其帐户的计算机数量(就像Gmail所做的那样)。
例如,如果他们在两台不同的计算机上登录,我希望该消息说:
You are logged in on 2 computers.
我知道如何检查他们是否已登录 - 我只检查$_SESSION['username']
变量,如果已设置,则他们将登录该计算机。但是如何检查在其他会话中是否设置了相同的username
(表明他们是否已在其他计算机上登录)?
答案 0 :(得分:2)
您将要将会话数据存储在数据库中。然后,如果有多个用户具有相同的ID,则可以查询数据库。
答案 1 :(得分:2)
使用基于默认文件的PHP会话非常困难。默认情况下,PHP只将会话信息存储在文件系统文件中的不透明blob中,文件名称为会话ID。您无法直接访问这些文件中的数据,而无需逐个打开它们并对其进行评估。
您需要将该信息移动到数据库中。要么只存储数据库中的并发登录数,要保持其他会话不变,但这很难保持同步。最好切换到会话的完整数据库后端,而不是基于文件的存储。这允许您透明地查询会话中的任何数据,包括轻松获取有关用户有多少会话的统计信息。
答案 2 :(得分: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';
答案 3 :(得分:0)
只需在users表上创建一个额外的列以用于登录计数。当用户登录服务器时,当用户注销时,使用1计数增加列数减少1个计数...
顺便为每个浏览器创建会话..您无法从会话中访问其他会话变量