我想让目前的在线用户与他们的最后登录时间的帮助。我在php中的时区是"Asia/Karachi“。
到目前为止我尝试过的:
$stmt = $db_con->prepare("SELECT COUNT(*) AS id
FROM users
WHERE last_login_time > DATE_SUB(NOW(), INTERVAL 5 MINUTE)");
$stmt->execute();
$row = $stmt->fetch(PDO::FETCH_ASSOC);
$total_rows = $row['id'];
echo total_rows;登录过程php:
$login_time = date('y-m-d h:i:s');
$stmt =$db_con->prepare("UPDATE users SET last_login_time='".$login_time."',last_login_ip='".$login_ip."' WHERE email='".$user_email."'");
$stmt->execute();SQL表:

问题:我想在我的php文件中显示在线用户,并且总是有数字0,即使我的上次登录时间小于5分钟.but,当我将间隔5分钟改为间隔50000分钟时,它显示了在线用户的数量。我试了很多,但没有达到任何目的!
发布于 2018-02-06 13:16:14
这很可能是因为您使用亚洲/卡拉奇作为PHP中的默认时区,但是数据库默认为UTC。最好在MySql和PHP中使用UTC,只使用本地时区显示。
如果你必须把你的约会对象存放在亚洲/卡拉奇,你有几个选择。其中之一是将您的MySql时区设置为亚洲/卡拉奇。另一种方法是在PHP中执行日期算法。所以你应该这样做:
$five_min_ago = date('Y-m-d H:i:s', strtotime('-5 minutes'));
$stmt = $db_con->prepare("
SELECT COUNT(*) AS id FROM users
WHERE last_login_time > :five_min_ago");
$stmt ->execute([':five_min_ago' => $five_min_ago]);还要注意您的日期格式字符串,使用大写Y和H。
发布于 2018-02-05 14:18:38
请参阅下面的更新:
我相信您的问题是基于MySQL使用与您的PHP不同的时区。如果来自PHP的MySQL连接不是localhost,那么这几乎肯定是正确的。
但是,即使您使用的是localhost,您也可能以某种方式错误地将您的MySQL设置为使用与您的系统不同的时区。
首先,read this post获取MySQL的当前时区,并输出一个小时/分钟的结果:
SELECT TIMEP_FORMAT(TIMEDIFF(NOW(), UTC_TIMESTAMP), '%H%i') as MySQLTime并将其与从date_default_timezone_get()检索到的PHP值和PHP时间进行比较:
print date("r");一旦您比较并发现这些是不同的时间值,然后调整您的MySQL时区using this answer here。
在PHP中:
更新:
我在php中的时区是"Asia/Karachi“。
这是你的问题。您的MySQL使用UTC,您的PHP使用"Asia/Karachi“。
因此,假设您希望保持PHP并将此时区应用于您的MySQL,则需要设置MySQL时区using this excellent answer。
如果您不能使用上面的链接中概述的核心方法,那么您可以在使用PDO执行脚本时这样做:
$pdo = new PDO('mysql:host=localhost;dbname=exampletable', 'user',
'pass', [PDO::MYSQL_ATTR_INIT_COMMAND =>"SET time_zone = 'Asia/Karachi'"]);您需要手动更新DataBase中已经设置的所有时间戳,但是添加的新时间戳将添加到正确的时区。
https://stackoverflow.com/questions/48624094
复制相似问题