1

こんにちは3時間以来、私はこの仕事をしようとしていますが、私が望む結果が得られません。オンラインとオフラインのステータスでユーザーリストを表示したい。

これが表です

そしてここで私がステータス結果を得ようとしたもの。

$loggedtime = time() - 300; // 5 minutes

$query = 'SELECT userid, handle FROM ^users WHERE loggedin = '.$loggedtime.' ORDER BY userid ASC';

// below are scripts function qa_ pleses refer this http://www.question2answer.org/functions.php

$result = qa_db_query_sub($query);  
$users = qa_db_read_all_assoc($result); 

$row = mysql_fetch_array($result);

if($row['userid'] > $loggedtime){
    echo $row['handle'].' is online';
} else {
    echo $row['handle'].' is offline';
}

これもそうではありません

foreach($users as $user){
    if($user['userid'] > $loggedtime){
        echo $user['handle']. ' is online';
    } else {
        echo $row['handle'].' is offline';
    }
}

上記のコードはどれも機能していません。私はMYSQLに不慣れで、PHPは基本を知っているだけなので、これを解決するのを手伝ってください。

編集: 私は今これを試しましたが、機能していません

foreach($users as $user){
                if($user['loggedin'] > $loggedtime){
                    echo $user['handle']. ' is online';
                } else {
                    echo $row['handle'].' is offline';
                }
            }

編集2

$query = "SELECT
    userid, handle, 
    CASE
        WHEN TIMESTAMPDIFF(SECOND, loggedin, NOW()) < 300
            THEN 'Online'
        ELSE 'Offline'
    END AS 'status'
FROM ^users
ORDER BY userid";

$result = qa_db_query_sub($query); 

while($user = mysql_fetch_array($result)){
    echo $user['handle'] . '<BR/>';
}

新しいアプローチ

新しいアプローチについては、これを確認してくださいユーザーオンラインオフラインステータス-オフラインステータスの問題

4

3 に答える 3

1

データベース側でチェックしてみませんか?

SELECT
    userid, handle, 
    CASE
        WHEN TIMESTAMPDIFF(SECOND, loggedin, NOW()) < 300
            THEN 'Online'
        ELSE 'Offline'
    END AS 'status'
FROM ^users
ORDER BY userid

TIMESTAMPDIFF(unit,datetime_expr1,datetime_expr2)return datetime_expr2 – datetime_expr1、 where datetime_expr1datetime_expr2aredateまたはdatetime式に使用できます。1 つの式が adateで、もう1 つの式が a である場合がありdatetimeます。値は、必要に応じて時間部分を持つdateものとして扱われます。結果の単位 (整数) は unit 引数で指定されます。unit の有効な値は、関数の説明に記載されている値と同じです。datetime'00:00:00'TIMESTAMPADD()

MySQL の日付と時刻の関数を見てください。

また、テーブル名には予約語を使用することを強くお勧めします。

于 2012-11-02T19:12:28.780 に答える
1

あなたの構造は質問に答えるのがおかしいように見えます。ログインフィールドは、実際には「最後にログインしたとき」のように見えます。彼らがいつログインしたかを知っているからといって、必ずしも彼らが「オンライン」であるとは限りません。

クエリが機能しない理由は、UNIX タイムスタンプを mysql 日時と比較しているためです。さらに、あなたは = を使用しているため、正確に 5 分前にログインしていない限り、これは機能しません。

最低でも。

SELECT userid, handle FROM ^users WHERE loggedin > '.date('Y-m-d h:i:s', time()-300).'ORDER BY....
于 2012-11-02T19:12:29.427 に答える
1

ユーザー ID の比較を修正したので、次の問題に取り組みましょう。

文字列 DATE と UNIX タイムスタンプを比較しようとしています。それらを同じタイプにして比較しましょう。

foreach($users as $user)
{
  $user_time = strtotime($user['loggedin']);
  if($user_time > $loggedtime)
  {
    echo $user['handle']. ' is online';
  } else {
    echo $row['handle'].' is offline';
  }
}

全体として、この問題に取り組む最善の方法ではありませんが、これでうまくいくかもしれません。上記のデータベース ソリューションがおそらく最適です。

于 2012-11-02T19:20:29.283 に答える