在Drupal中获取所有登录用户

Dan*_*ica 3 drupal

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

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

Jam*_* An 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);
}
Run Code Online (Sandbox Code Playgroud)

该查询排除会话,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));
Run Code Online (Sandbox Code Playgroud)

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

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

您可能还想限制返回的用户数.例如,您最多可能想要访问访问该网站的最后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);
Run Code Online (Sandbox Code Playgroud)

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