1

我正在尝试找出一种方法来显示用户(不是自己)当前是否已登录。目前这是用于 edit_user 页面,暂时仅用于作为管理员,但这可能会扩展为我开发。我在想一些事情

if( $user->ion_auth->logged_in() ) {
    echo "<span class='active'>$user->username</span>";
}

但这不起作用。有任何想法吗?

我找到了我的答案并在下面提供了它,感谢您的其他答案并激发了一些想法。

4

3 回答 3

2

使用“活动”字段,因此您可以打开/关闭用户登录的能力。如果您查看数据库,您会看到您创建的所有用户都有“活动=1”。此字段不会告诉您用户是否已登录。唯一可以给您一些指示的字段是“last_login”字段,它会告诉您他们上次登录的时间。但是,这不会告诉您他们当前是否登录(基本上您想知道他们是否仍然有一个活动会话,并且由于您不在该用户的电脑上,因此无法知道这一点)。

我知道更准确地跟踪用户当前是否登录的唯一方法是让数据库跟踪用户上次访问任何页面的时间。如果用户上次访问页面的时间太久了,那么您就知道该用户不再登录。我不推荐这种方法,因为本质上,您网站上的每个请求/刷新都有一个数据库写入用户。这可能会给您的数据库/服务器负载带来问题,尤其是当您忙于处理用户时。

那么你有哪些更合理的选择呢?

  1. 只需通过最后一次登录来了解谁已登录。
  2. 如果用户仍然登录,则运行预系统或预控制器挂钩以更新用户的表,但将其写入数据库的频率较低,可能在小时(+一些随机分钟以分散写入更多)。您需要在用户表中添加一个新字段以进行跟踪。
  3. 谷歌分析估计您网站上的活跃用户数量。但是,这只会为您提供这些用户实际是谁的总体信息,而不是具体信息。
于 2013-05-29T02:47:16.723 回答
2

我喜欢这个输入,它让我思考。所以这是我决定采用的解决方案。我决定使用数据库中已有的序列化会话数据,而不是添加插入或更新语句。这也利用了 ci 和 ion-auth 的现有功能,而无需修改它们。因此,如果其他人想使用它,这里是代码:

// character length of the userid
$userID_Length = strlen( $user->id );

// set a time to look at for validity
$now = time() - ( 10 * 60 ); // (minutes x seconds)

// query statement
$statement = "SELECT session_id FROM ci_sessions WHERE last_activity >= $now AND user_data LIKE '%s:7:\"user_id\";s:$userID_Length:\"$user->id\";%'";
// run query
$query = $this->db->query( $statement );

// check results of query
if( $query->num_rows() > 0 )
{
    // positive result
}
else
{
    // negative result
}
于 2013-06-06T17:50:36.483 回答
0

Ion auth 已经有一列last_login 。将另一列last_logout 添加到 users 表中。(unix 时间)

现在使用查询来获取登录用户

SELECT `user_name` From `users` WHERE `login_time` > `logout_time`
于 2013-06-03T17:22:38.477 回答