4

データベースを使用してセッションデータを保存しています。現在アクティブなセッションをクエリし、現在のページで使用する値を返す関数をいくつか作成しました。開いているセッションの数を取得するのは、「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データベースに保存する方がよいでしょうか。

**編集*** 現在ログインしているすべてのユーザー(サイトに登録してログインしているユーザー)のユーザー名を表示しようとしています。

4

2 に答える 2

0

善悪の価値判断には踏み込みませんが、もっと簡単な方法があることは間違いありません。最も簡単な方法は、ユーザー ID とタイムスタンプを使用してページ アクセスごとにアップサートする DB テーブルを用意しCOUNT(*)、過去 15 分間程度に対して実行することです。適切なインデックス作成があれば、パフォーマンスへの影響はごくわずかです

あなたが何をしているのかを明確にするために投稿したコメントのいくつかを読むと、セッションテーブルに対してこれを簡単に行うことができます。「オンラインのユーザー」はそれほど重要ではないため、ユーザーが 2 回ログインして複数のセッションが発生する可能性はそれほど重要ではありません。

于 2012-08-24T19:32:23.237 に答える