1

まず、これはPHPの関連する質問です:オンラインオフラインステータス しかし、私のアプローチは少し異なり、問題もあるので、新しい質問の方が良いと思いました。

ここで、「online」と呼ばれるqa_usersテーブルに1つの列を追加しました。これは、ロギング時間を挿入/更新し、ユーザーの操作時に更新を維持します(正しいかどうかはわかりません)

現在、ユーザーはログインするとすぐにオンラインで表示されますが、問題はログアウト後もオンラインとして表示状態を維持し、オフライン状態になることはありません。

時間比較の条件付きコードに何か問題があると思いますが、何がわかりません。

私が使用しているコードを以下に見つけてください。

$loggedtime = date('Y-m-d h:i:s', time()-300); // 5 minutes

$query = 'SELECT userid, handle, online FROM ^users ORDER BY userid ASC';           
$result = qa_db_query_sub($query);  

while($ids = mysql_fetch_array($result)){

    $online = $ids['online'];
    $userid = qa_get_logged_in_userid();

    if(qa_is_logged_in()){
        $update = 'UPDATE ^users SET online = NOW() WHERE userid = '.$userid.'';

        qa_db_query_sub($update);
    }

    $time = $ids['online'];

    if ($time >= $loggedtime){ // i have tried with $loggedtime > $time too
        echo '<li>'.$ids['handle'].' online</li>';
    } else {
        echo '<li>'.$ids['handle'].' offline</li>';
    }               

}
4

2 に答える 2

2

DB構造を知らなければ、それは一種の推測です。

if ($time >= $loggedtime)

「2012-11-01 10:10:10」のような文字列を$timeDB にあるものと比較しています。ここが問題のようです。UNIXタイムスタンプを使用できます/使用する必要があります。それらは簡単に比較できます。

UNIXタイムスタンプの場合$time、次のことができます。

if ($time >= time()-300)

編集:

の UNIX タイムスタンプを取得するようにクエリを変更します。online

$query = 'SELECT userid, handle, UNIX_TIMESTAMP(online) as online FROM ^users ORDER BY userid ASC';

EDIT2: より明確にするために:最初のバージョンでは、「2012-11-01 10:10:10」の形式で2つの日付を比較していました

if ('2012-11-01 10:10:10' < '2012-11-02 10:10:10')

これは PHP では機能しません。次のようにします。

if ('apples' < 'bananas')

数を比較する必要があります。したがって、簡単に比較できる UNIX タイムスタンプを使用することをお勧めします。

于 2012-11-03T10:23:35.233 に答える
1

これから始めましょう:

mysql_*新しいコードで関数を使用しないでください。それらはもはや維持されておらず、非推奨プロセスが開始されています。赤いボックスがか? 代わりに準備済みステートメントについて学び、 PDOまたはMySQLiを使用してください。この記事は、どちらを決定するのに役立ちます。PDO を選択する場合は、ここに良いチュートリアルがあります。


この種のことに対して私が使用したアプローチは、ユーザーのログイン状態を保存するだけでなく、ユーザーの最後の活動時間も保存することです。

アクティビティが意味する場合:

  • ページにアクセスしました。
  • フォームを送信しました。
  • あなたのサイトで何かをした

次のいずれかに該当する場合、ユーザーはログアウトしたと見なされます。

  • ユーザーは「ログアウト」リンクからログアウトしました。
  • ユーザーは N 秒間アクティブではありませんでした。

アクティビティを確認するには、最後のアクティビティ時間を現在の時間と比較します。差 ( $currentTime - $lastActiveTime) が より大きい場合N、ユーザーはログアウトしていると見なされます。

ログインしているユーザーのリストは数秒ごとに更新され (ある種のキャッシュ メカニズムを使用)、非アクティブなユーザーはUPDATEデータベースで "ログアウト" されるため、クエリ時間とその後の処理時間を節約できます。

于 2012-11-03T10:26:10.350 に答える