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)to return datetime_expr2 – datetime_expr1、 wheredatetime_expr1datetime_expr2aredatedatetime表达式。一个表达式可能是 a date,另一个是 a datetime;值在必要时date被视为具有datetime时间部分。'00:00:00'结果的单位(整数)由 unit 参数给出。unit 的合法值与函数描述中列出的值相同TIMESTAMPADD()

看看MySQL 日期和时间函数

另外,我强烈建议对表名使用保留字

于 2012-11-02T19:12:28.780 回答
1

你的结构看起来很有趣,可以回答这个问题。您的登录字段实际上看起来更像是“他们最后一次登录”。仅仅因为您知道他们何时登录并不一定意味着他们“在线”。

您的查询不起作用的原因是您将 UNIX 时间戳与 mysql 日期时间进行比较。此外,您正在使用 = 所以除非他们在五分钟前完全登录,否则这将不起作用。

至少。

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 回答