我希望在上次登录时间的帮助下获得当前的在线用户。 我在php的时区是"亚洲/卡拉奇"。
到目前为止我尝试了什么:
0 * double.NaN == double.NaN
登录过程php:
$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;
SQL TABLE:
问题: 我想在我的php文件中显示在线用户,并且即使我上次登录时间小于5分钟也总是数字0。但是当我将INTERVAL 5 MINUTE更改为INTERVAL 50000 MINUTE时,它显示在线用户的数量。 我已经尝试了很多,但没有达到任何一点!
答案 0 :(得分:2)
请参阅底部的更新:
我相信你的问题是基于MySQL使用与PHP不同的时区。如果来自PHP的MySQL连接不 localhost
,这几乎肯定是正确的。
但是,即使您使用的是localhost
,也可能会错误地将MySQL设置为使用与PHP系统不同的时区。
首先; 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 define('TIMEZONE', 'Europe/Paris'); date_default_timezone_set(TIMEZONE);
对于MySQL:
<?php $now = new DateTime(); $mins = $now->getOffset() / 60; $sgn = ($mins < 0 ? -1 : 1); $mins = abs($mins); $hrs = floor($mins / 60); $mins -= $hrs * 60; $offset = sprintf('%+d:%02d', $hrs*$sgn, $mins); //Your DB Connection - sample $db = new PDO('mysql:host=localhost;dbname=test', 'dbuser', 'dbpassword'); $db->exec("SET time_zone='$offset';");
我在php的时区是&#34;亚洲/卡拉奇&#34;。
这是你的问题。你的MySQL正在使用UTC而你的PHP正在使用&#34; Asia / Karachi&#34;。
因此,假设您要保留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中设置的所有时间戳,但添加的新时间戳将添加到正确的时区中。
答案 1 :(得分:0)
这很可能是因为您使用亚洲/卡拉奇作为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
。