データベースを使用してセッションデータを保存しています。現在アクティブなセッションをクエリし、現在のページで使用する値を返す関数をいくつか作成しました。開いているセッションの数を取得するのは、「SELECT SessionData FROM UserSessions」のような単一のクエリで十分簡単に思え、クエリによって返された行数を返します。
次に、現在「オンライン」になっているサイトユーザーを特定したいと思いました。セッションには、Webサイトを表示しているユーザーのユーザーIDが保存されます。検索して検索したところ、シリアル化されたデータのように見えるものをデコードするためのsession_decode関数しか見つからなかったようです(ただし、unserializeは機能しません)。ここでの唯一の問題は、session_decodeが$_SESSIONスーパーグローバルに自動的にデータを入力することです。だから私の質問は、$ _ 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;
}
これは機能するように思えますが、これが失敗して、現在のユーザーが他のユーザーのセッションデータになり、管理者などとして効果的にサインインするという既知のケースはありますか?UserIDなどを格納する別のフィールドをUserSessionsデータベースに保存する方がよいでしょうか。
**編集*** 現在ログインしているすべてのユーザー(サイトに登録してログインしているユーザー)のユーザー名を表示しようとしています。