我正在使用數據庫來存儲我的會話數據。我創建了一些函數來查詢當前活動會話並返回一些值用於當前頁面。獲取打開的會話的數量似乎與像 一個單一的查詢很容易「選擇SessionData FROM UserSessions」 並返回查詢返回的行數。
我當時就想,以確定哪些網站的用戶,目前「在線」。會話存儲正在查看網站的用戶的用戶ID。我搜索和搜索,似乎只找到解碼似乎是序列化數據的session_decode函數(但反序列化不起作用)。這裏唯一的問題是,session_decode會自動填充$ _SESSION superglobal。所以我的問題是,暫時存儲$ _SESSION數據是否「壞」,對當前在線的每個用戶使用session_decode,然後將$ _SESSION變量重置爲臨時存儲的數據?
function getLoggedInUsers() {
//NEED SOME ERROR HANDLING AROUND DB STUFF
$oConn = DB::connect(RF_DSN);
$oPrep = $oConn->prepare("SELECT SessionData FROM UserSessions WHERE SessionData LIKE ?");
$oRes = $oConn->execute($oPrep, array("%UserID%"));
$aCurSession = $_SESSION; //STORE SESSION DATA TO RESET LATER
$aLoggedInUsers = array();
while ($oRow = $oRes->fetchRow(DB_FETCHMODE_ASSOC)) {
if ($oRow == NULL) {
break;
}
$_SESSION = array();
session_decode($oRow["SessionData"]);
$aLoggedInUsers[] = new User($_SESSION["UserID"]);
$_SESSION = array();
}
$_SESSION = $aCurSession; //RESET SESSION DATA TO CURRENT ONLINE USER
return $aLoggedInUsers;
}
在我看來,這將工作,但都沒有任何已知的情況下,這可能會失敗,那麼當前的用戶最終會與一些其他用戶的會話數據,有效地簽字作爲一個可能的聯繫或什麼?將UserSession數據庫中的另一個字段存儲在UserSession數據庫中是否會更好?
**編輯*** 我想顯示所有當前的登錄用戶的用戶名(其中已註冊的網站上,並登錄)。
爲了說明一下,你是否已經爲使用'session_set_save_handler'註冊的數據庫編寫了自己的會話處理程序?如果是這樣,您可以添加一個列,用於存儲上次訪問/修改會話的時間,並使用該列來確定使用單個查詢登錄的用戶。 – drew010
你不能只在SessionData表上運行一個COUNT(*)查詢來找出行數(假設每行都是一個活動會話)並只打印該查詢的結果?使用像你這樣的超全球_SESSION似乎沒有必要找到活動會話的數量,除非我錯過了一些東西。 –
@ drew010是的,我有。 UserSessions表使用3個字段。 SessionID,SessionData,LastAccessed。 LastAccess用於刪除活動超過一定時間的會話。你建議使用實際的Users表而不是Sessions表嗎? –