2010-06-22 168 views
3

我有這個Drupal網站,我想有我自己的聊天(不能使用聊天模塊,因爲我必須個性化它)。我必須檢索所有在線用戶,但是我看不到任何變量。獲取所有登錄用戶Drupal

我只能夠得到的當前登錄的用戶而不是其餘用戶登錄名。

+0

創建自己的聊天可能需要很多工作。我建議你仔細看看聊天室模塊。您可以使用其他模塊自定義Drupal模塊,以便它們滿足您的需求。如果您詢問有關您需要對聊天模塊進行特定個性化的問題,這可能是更好的方法。 – 2010-06-22 08:25:36

回答

12

您可以通過查詢會話表獲取所有登錄用戶的列表。我假設你正在使用的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中描述的用戶對象的數組。

如果您已經知道用戶對象的哪部分內容(例如,只是用戶標識和名稱),可以通過刪除while循環中的user_load()並向查詢中添加用戶表,因爲每個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(如$極限或者3600s),你應該使用variable_set(),variable_get()和variable_del()來使它們持久化。

+0

感謝您的回覆。這看起來像會起作用。我會在完成我的其他項目後立即嘗試並檢查它。再次感謝! – Danica 2010-06-22 08:33:47

+0

沒問題!就像Je​​remy French說的那樣,創建自己的聊天可能比採用現有的聊天模塊之一更重要,並且重寫其掛鉤和主題功能(如果模塊寫得很好)。我的代碼是在「Who's Online」塊中顯示登錄用戶並將其集成到[RealChat](http://www.realchat.com/)的自定義模塊包裝中,以顯示在線用戶的聊天狀態。 – 2010-06-22 08:55:41