我有以下代码块,它在localhost上完美运行,但在实际站点上不起作用。我已经更新了我的xampp,因此我正在运行PHP 7,因为我在我的服务器上只是因为这是一个问题。
<?php
try {
$minutes = 10;
$status = date('Y-m-d H:i:s', time() - $minutes * 60);
$getOnlineUsers = $db->query("SELECT user_online.*, members.username,
(SELECT COUNT(id) FROM user_online WHERE last_active > '$status' AND memberID = '0') AS guest
FROM user_online
LEFT JOIN members ON members.memberID = user_online.memberID
WHERE last_active > '$status' ");
$total = ($getOnlineUsers->rowCount());
if ($total > 0) {
while ($row = $getOnlineUsers->fetch()) {
echo '<ul>';
if ($row['memberID'] == '0') {
echo '<li>guest' . $row['id'] . '</li>';
} else {
if ($row['memberID'] == '1') {
echo '<li>' . $row['memberID'] . ' ' . $row['username'] . ' <a>ADMIN</a></li>';
} else {
echo '<li>' . $row['memberID'] . ' ' . $row['username'] . '</li>';
}
}
echo '<li>online: ' . $row['last_active'] . '</li>';
echo '</ul>';
echo '<br />';
}
} else {
echo 'nobody online';
}
} catch (PDOException $e) {
echo $e->getMessage();
}
echo '<br />';
echo $total; // added just to see number rows returned
?>
我要做的是列出所有在线/访问我网站的会员和访客。 last_active
值存储为时间戳,并在用户查看新页面时更新,其想法是记录的任何用户未在10分钟内更新last_active
$minutes=10;
“实时”的结果中没有显示。
目前我没有收到任何错误,但如果我搞乱了代码,那么就会产生错误,因此报告工作正常。
我在脚本底部添加了$total;
以显示返回了多少行,在这里我看到一个问题,因为它返回'0' - 仅在现场网站上,localhost是细
如果我将$minutes=10
更改为$minutes=90
,那么在实际网站上就可以了!但是,如果我低于'90'那么它就不会。
我对此问题感到困惑,因为它适用于localhost,但之后却不在实时网站上。 我已经检查过所有数据库字段是否相同,值是否正在更新确定..所有内容似乎都很好。
有什么明显的东西我没有在这里看到,或有任何关于为什么会发生这种情况的建议?
答案 0 :(得分:0)
我注意到您正在计算PHP中的时间戳,然后将其与MySQL值进行比较。这确实存在PHP和MySQL服务器不在同一时间的风险。
在localhost
上,确实不存在混淆的可能性,但是当您的MySQL服务器使用UTC时,您的实时服务器可能会运行PHP,例如BST。 (遗憾的是,我从T_T的经验谈到)如果MySQL服务器是一台不同的物理机器,问题就会变得更糟,因为它们可能相差几秒甚至几分钟(或者,再次从经验来看,46分钟不同步......)
最安全的方法是不要交叉计算这样的日期。相反,请考虑使用:
WHERE last_active > DATE_SUB(NOW(), INTERVAL $minutes MINUTE)
但除此之外,你应该确保PHP和MySQL在时间上达成一致:
SELECT NOW();
echo date("Y-m-d H:i:s");
答案 1 :(得分:0)
让我通过php date函数或mysql查询知道last_active字段插入更新?
两者都是不同的。
在这里,您可以在查询中传递PHP日期和时间。因此,如果您使用mysql保存last_active数据,那么它会根据php日期时间在select中创建一个问题。
因此,如果使用mysql now()函数保存last_active,则在select中使用mysql的date函数。