2

我的网站使用会话进行用户登录,我希望在每个页面上都有一条消息,向用户显示有多少计算机登录到他们的帐户(就像 Gmail 所做的那样)。

例如,如果他们在两台不同的计算机上登录,我希望消息说:

You are logged in on 2 computers.

我知道如何检查他们是否已登录——我只是检查$_SESSION['username']变量,如果已设置,则他们已在该计算机上登录。但是如何检查是否username在其他会话中设置了相同的设置(表明它们已在其他计算机上登录)?

4

4 回答 4

2

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

于 2013-07-29T17:45:15.057 回答
2

这对于基于默认文件的 PHP 会话来说是非常困难的。默认情况下,PHP 只是将会话信息存储在文件系统中文件的不透明 blob 中,文件名是会话 ID。如果不一一打开并评估它们,您将无法直接访问这些文件中的数据。

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

于 2013-07-29T17:46:41.640 回答
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';
于 2013-07-29T18:01:49.567 回答
0

只需在用户表上创建一个额外的列用于登录计数。当用户登录服务器时,该列增加 1 个计数 当用户注销时,该列减少 1 个计数...

顺便说一下,为每个浏览器创建会话..您不能从会话中访问其他会话变量

于 2013-07-29T17:47:34.280 回答