【问题标题】:User online offline status - offline status issue用户在线离线状态 - 离线状态问题
【发布时间】:2012-11-03 10:16:49
【问题描述】:

首先这是PHP: Online Offline Status的相关问题 但是由于我的方法几乎没有什么不同并且也有问题,所以我认为新问题会更好。

现在我在 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>';
    }               

}

【问题讨论】:

    标签: php mysql status


    【解决方案1】:

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

    if ($time >= $loggedtime)
    

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

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

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

    编辑:

    更改您的查询以获取 online 的 UNIX 时间戳

    $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 时间戳。

    【讨论】:

    • 你是对的。实际上我也尝试过 $loggedtime > $time 但没有任何工作..让我试试你的建议
    • 现在每个人都下线了
    • 查看 en.wikipedia.org/wiki/Unix_time 获取 unix 时间戳。您需要弄清楚的是如何从您的数据库中获取 unix 时间戳。如果您愿意向我们提供您的表结构,我们可以帮助查询。
    • 也许你插入一个echo $time 看看,$time 是什么;)
    • 是的,让我用回声检查...这是我得到的时间格式2012-11-03 14:28:38 我认为这可能是格式不同的原因。可以吗?
    【解决方案2】:

    让我从这个开始:

    Please, don't use mysql_* functions in new code。它们不再维护,deprecation process 已开始使用。看到red box?改为了解prepared statements,并使用PDOMySQLi - this article 将帮助您决定哪个。如果你选择 PDO,here is a good tutorial


    我做这类事情的方法,不仅要保存用户的登录状态,还要保存他的上次活动时间

    活动可能意味着:

    • 访问了一个页面。
    • 已提交表单。
    • 在您的网站上做过任何事情

    如果满足以下条件之一,则认为用户已注销:

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

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

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

    【讨论】:

    • 其实他就是这么做的。他更新了“在线”栏。正如我所指出的,他只是把比较弄错了。
    • 一件事要澄清。我没有给你反对票。其次,我正在阅读您的答案,但确实无法理解大多数事情。可能是因为我是 MySQL 新手,也可能是您使用了专家术语或语言。
    • @pixelngrain:你不明白什么?我会尽力澄清。
    • 首先介绍弃用过程。第二我如何获得活动时间。我的意思是如何识别用户已注销。我认为通过创建和更新时间将是最简单的方法,因为它将在页面刷新或重新加载时保持更新时间,并且 php 时间可以保持检查匹配或不匹配,而不是状态变化。但不知道为什么不工作
    • @pixelngrain:关于“不要使用mysql_*函数”,阅读相关链接,仔细阅读。 mysql_* 函数很古老,不应再使用。至于识别用户的登录状态,每次用户在您的网站上做某事时,您都会将“上次活动时间”更新为当前时间。然后,当查看列表时,您只显示最后一次活动的人(例如)不到 10 分钟前。所以如果我在 11 分钟前离开你的网站,我会被认为是离线,因为我很长时间没有做任何事情。
    猜你喜欢
    • 1970-01-01
    • 2018-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多