首先这是PHP: Online Offline Status的相关问题 但由于我的approch有点不同而且问题太多,所以我认为新的问题会更好。
现在我在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>';
}
}
答案 0 :(得分:2)
在不知道你的数据库结构的情况下,这是一种猜测。
if ($time >= $loggedtime)
您正在将“2012-11-01 10:10:10”等字符串与数据库中的$time
进行比较。这似乎是问题所在。
您可以/应该使用UNIX时间戳。它们很容易比较。
如果$time
是UNIX时间戳,您可以这样做:
if ($time >= time()-300)
修改强>
更改查询以获取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时间戳。
答案 1 :(得分:1)
让我从这开始:
Please, don't use
mysql_*
functions in new code。它们不再被维护,deprecation process已经开始了。请参阅red box?转而了解prepared statements,并使用PDO或MySQLi - this article将帮助您确定哪个。如果您选择PDO here is a good tutorial。
我用于此类事情的方法,不仅要保存用户的登录状态,还要保存上次活动时间。
活动可能意味着:
如果符合下列条件之一,则会将用户视为已注销:
要检查活动,请将上次活动时间与当前时间进行比较。如果差异($currentTime - $lastActiveTime
)大于N
,则认为该用户已退出。
登录用户列表将每隔几秒刷新一次(使用某种缓存机制),其中非活动用户在数据库中UPDATE
d“登出”,从而节省一些查询时间和以后的处理时间。