在Drupal中获取所有登录用户

时间:2010-06-22 07:46:44

标签: drupal

我有这个Drupal网站,我希望自己聊天(不能使用聊天模块,因为我必须个性化它)。我必须检索所有在线用户,但我看不到任何变量。

我只能获取当前登录用户的名称,但不能获取其他登录用户的名称。

1 个答案:

答案 0 :(得分:13)

您可以通过查询会话表来获取所有登录用户的列表。我假设你正在使用Drupal 6。

<?php
$result = db_query('SELECT uid FROM {sessions} WHERE uid != 0');
$users = array();
while($user = db_fetch_array($result)) {
  $users[] = user_load($user);
}

该查询会排除uid = 0的会话,因为这些是匿名用户。 $usersDrupal API Docs中描述的用户对象数组。

如果您已经知道将要使用的用户对象的哪个部分(例如,只是用户ID和名称),则可以通过删除while循环中的user_load()并向查询添加与users表的连接来优化此操作,因为每个user_load()进行一次额外的查询。以下内容将为您提供登录用户的ID和名称列表:

<?php
$result = db_query('SELECT u.uid, u.name FROM {sessions} s INNER JOIN {users} u ON u.uid = s.uid WHERE s.uid != 0');
$users = array();
while($users[] = db_fetch_array($result));

由于登录用户永远不会超时(您可以无限期地保持登录状态),因此排除一段时间内未访问该站点的登录用户(即可能一小时不活动)可能很有用:

$timestamp = time - 3600; // 3600s is one hour.
$result = db_query('SELECT uid FROM {sessions} WHERE uid != 0 AND timestamp >= %d', $timestamp);

您可能还想限制要返回的用户数。例如,您可能希望最多抓住访问该网站的最后10位登录用户:

$limit = 10; // Limit to the last 10 users.
$result = db_query_range('SELECT uid FROM {sessions} WHERE uid != 0 ORDER BY timestamp DESC', $timestamp, 0, $limit);

顺便说一句,如果你要使用magic numbers(比如$ limit或3600s),你应该使用variable_set(),variable_get()和variable_del()使它们持久化。