PHP:联机脱机状态
嗨,3个小时以来,我一直在努力工作,但没有得到我想要的结果。我想显示联机和脱机状态的用户列表 这是桌子 这里是我试图得到的结果PHP:联机脱机状态,php,mysql,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 re
$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/>';
}
$query=“选择
用户ID,句柄,
案例
当TIMESTAMPDIFF(秒,loggedin,NOW())小于300时
然后“在线”
否则“离线”
以“状态”结尾
来自^users
按用户ID排序”;
$result=qa_db_query_sub($query);
while($user=mysql\u fetch\u数组($result)){
echo$user['handle']。
;
}
新方法
请检查此新方法为什么不只检查数据库端
SELECT
userid, handle,
CASE
WHEN TIMESTAMPDIFF(SECOND, loggedin, NOW()) < 300
THEN 'Online'
ELSE 'Offline'
END AS 'status'
FROM ^users
ORDER BY userid
选择
用户ID,句柄,
案例
当TIMESTAMPDIFF(秒,loggedin,NOW())小于300时
然后“在线”
否则“离线”
以“状态”结尾
来自^users
按用户ID排序
您可以使用TIMESTAMPDIFF(unit,datetime\u expr1,datetime\u expr2)
返回datetime\u expr2–datetime\u expr1
,其中datetime\u expr1
和datetime\u expr2
是datetime
表达式。一个表达式可以是日期
,另一个表达式可以是日期时间
;date
值被视为datetime
,必要时具有时间部分'00:00'
。结果的单位(整数)由unit参数给出。单位的法定值与TIMESTAMPADD()
函数说明中列出的值相同
请看下面的图片
另外,我强烈建议使用表名。您的结构看起来很有趣,可以回答这个问题。您的loggedin字段实际上看起来更像“上次登录时”。你知道他们何时登录并不一定意味着他们“在线” 查询不起作用的原因是您正在将UNIX时间戳与mysql日期时间进行比较。此外,您使用的是=so,除非他们在五分钟前登录,否则这将不起作用 至少
SELECT userid, handle FROM ^users WHERE loggedin > '.date('Y-m-d h:i:s', time()-300).'ORDER BY....
既然您修复了用户id比较,那么让我们来解决下一个问题 您正在尝试比较字符串日期和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';
}
}
总的来说,这不是解决这个问题的最佳方法,但它可能会让你工作。上面的数据库解决方案可能是最好的。比较userid和$loggedtime似乎有点古怪和不合逻辑,因为它们没有共同点。修复这个问题,看看会发生什么。我已经编辑了更新的代码。你能检查一下并告诉我哪里错了吗?那么如果我使用这个查询,我就必须在php中有条件地检查吗?或者它将完成这个查询本身?很抱歉,这种类型的代码首先编写time@pixelngrain查看我的更新查询。如果你使用这个,你不必在PHP中做任何检查。好的,让我尝试一下,然后马上给你回复。请检查我的编辑2我正在获取所有用户,无论状态如何。很抱歉,在这件事上我真是个小飞象。请不要生气frustrate@pixelngrain您是否试图显示过去5分钟内用户的状态?如果是,那么决定他们在线还是离线的标准是什么?您还需要
echo$user[status]。'
代码>这不是渲染任何东西。。!在我的本地机器上测试了这段代码,从上面手动输入datetimes。。它是有效的。是的,我能理解,但不知怎么的,我不明白。这些查询功能会导致问题吗<代码>结果=qa\U db\U查询\U子($query);$users=qa_db_read_all_assoc($result)代码>查看您的MySQL查询<代码>选择用户ID,从^users处处理,其中loggedin='。$loggedtime。'ORDER BY userid ASC
此逻辑在lamen中表示:“让我知道用户的登录时间等于当前时间减去5分钟。除非你有一个精确到1秒的记录,否则你永远不会得到结果……拿出WHERE子句,看看它是如何工作的:selectuserid,handlefrom^users ORDER BY userid ASC
Oh wow。。谢谢你通知我。。我百分之百同意你。那么现在我如何才能获得状态呢?这是一个比这篇文章所允许的复杂得多的答案,它需要额外的字段、会话检查等等……你的意思是创建额外的表吗?不一定是额外的表,但可能比你当前的结构更健壮。这完全取决于项目。实际上,我想显示用户列表,其中显示在线和离线状态。我正在使用这个开源软件。如果可能有帮助的话,您可以在这里阅读一些函数