2012-08-24 37 views
4

我正在使用數據庫來存儲我的會話數據。我創建了一些函數來查詢當前活動會話並返回一些值用於當前頁面。獲取打開的會話的數量似乎與像 一個單一的查詢很容易「選擇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數據庫中是否會更好?

**編輯*** 我想顯示所有當前的登錄用戶的用戶名(其中已註冊的網站上,並登錄)。

+0

爲了說明一下,你是否已經爲使用'session_set_save_handler'註冊的數據庫編寫了自己的會話處理程序?如果是這樣,您可以添加一個列,用於存儲上次訪問/修改會話的時間,並使用該列來確定使用單個查詢登錄的用戶。 – drew010

+0

你不能只在SessionData表上運行一個COUNT(*)查詢來找出行數(假設每行都是一個活動會話)並只打印該查詢的結果?使用像你這樣的超全球_SESSION似乎沒有必要找到活動會話的數量,除非我錯過了一些東西。 –

+0

@ drew010是的,我有。 UserSessions表使用3個字段。 SessionID,SessionData,LastAccessed。 LastAccess用於刪除活動超過一定時間的會話。你建議使用實際的Users表而不是Sessions表嗎? –

回答

3

我會建議爲你增加一列,其分開存儲的用戶ID的會話數據之外的會話表。這樣你可以使用SQL來獲取這樣的名字。 (使用假設用戶表)

SELECT UserTable.userName FROM SessionData 
INNER JOIN UserTable 
ON SessionData.userId = UserTable.id 

假設你正在使用另一個查詢清理舊會話的時間預先確定的時間後這個查詢會爲每個登錄用戶爲同時返回當前會話數據以及用戶表中包含用戶名的用戶行。

$_SESSION陣列應只用於存儲有關用戶的當前會話,現場周圍沒有其他會話的信息。

+0

謝謝你的信息!我將需要在我的write_session()處理程序中使用$ _SESSION變量,因爲它已經傳遞了序列化數據。因此,只需將會話表的用戶標識設置爲$ _SESSION用戶標識,是否正確? –

+0

會話表中的'userId'字段應該對應於用戶表中的'id'字段(或任何它的名字),假設你的應用程序有任何意義,也應該是'$ _SESSION ['UserId']的值爲每個用戶。 –

0

我不會去的好的和壞的價值判斷,但有肯定會更簡單的方式來做到這一點。最簡單的是隻具有您在與用戶ID和時間戳每個頁面訪問UPSERT一個數據庫表,做一個對COUNT(*)最後15分鐘左右。通過適當的索引,性能影響可以忽略不計

閱讀您發佈的一些評論,闡明您在做什麼,您可以輕鬆地對會話表執行此操作。由於「在線用戶」並不十分重要,用戶登錄兩次並進行多次會話的可能性並不是那麼重要。

+0

謝謝!這就是我現在正在做的事情。關於用戶登錄兩次,我只是添加了一個功能,刪除該用戶標識的舊會話到登錄腳本中。 –