PHP:在线离线状态

时间:2012-11-02 19:09:47

标签: php mysql

您好,因为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/>';
}

新方法

请检查此新方法User online offline status - offline status issue

3 个答案:

答案 0 :(得分: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)返回datetime_expr2 – datetime_expr1,其中datetime_expr1datetime_expr2datedatetime表达式。一个表达式可以是date,另一个是datetime; date值被视为datetime,必要时包含时间部分'00:00:00'。结果的单位(整数)由单位参数给出。单位的合法值与TIMESTAMPADD()函数说明中列出的值相同。

查看MySQL Date and Time Functions

另外,我强烈建议使用reserved words来表名。

答案 1 :(得分:1)

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

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

至少。

SELECT userid, handle FROM ^users WHERE loggedin > '.date('Y-m-d h:i:s', time()-300).'ORDER BY....

答案 2 :(得分: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';
  }
}

总体而言,这不是解决此问题的最佳方法,但它可能会让您正常工作。上面的数据库解决方案可能是最好的。