1

首先,这是PHP 的相关问题:在线离线状态 但由于我的方法略有不同并且问题也很大,所以我认为新问题会更好。

现在我在 qa_users 表中添加了一个名为“online”的列,它插入/更新记录时间并在用户交互时保持更新(我不确定它是否正确)

现在它会在用户登录后立即在线显示用户,但问题是在注销后他们保持显示状态为在线并且永远不会进入离线状态。

我认为我的时间比较条件代码有问题,但我不知道。

请在下面找到我正在使用的代码。

$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

在不知道您的数据库结构的情况下,这是一种猜测。

if ($time >= $loggedtime)

您正在将“2012-11-01 10:10:10”之类的字符串与$time数据库中的任何内容进行比较。这似乎是这里的问题。您可以/应该使用 UNIX 时间戳。它们可以很容易地进行比较。

如果$time是 UNIX 时间戳,您可以这样做:

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”的形式比较两个日期

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_*在新代码中使用函数。它们不再被维护,并且已经开始弃用过程。看到红框了吗?改为了解准备好的语句,并使用PDOMySQLi -本文将帮助您决定使用哪个。如果您选择 PDO,这里有一个很好的教程


我用于此类事情的方法是不仅保存用户的登录状态,还保存他的最后活动时间

活动可能意味着:

  • 浏览了一页。
  • 提交了表格。
  • 在您的网站上做过任何事情

如果以下情况之一适用,则认为用户已注销:

  • 用户已通过“注销”链接注销。
  • 用户已 N 秒未处于活动状态。

要检查活动,请将上次活动时间与当前时间进行比较。如果差 ( $currentTime - $lastActiveTime) 大于N,则认为用户已注销。

登录用户列表将每隔几秒钟刷新一次(使用某种缓存机制),其中非活动用户将UPDATE在数据库中“注销”,从而为您节省一些查询时间和以后的处理时间。

于 2012-11-03T10:26:10.350 回答