获取当前在线用户的php pdo

时间:2018-02-05 13:50:45

标签: php sql pdo timezone

我希望在上次登录时间的帮助下获得当前的在线用户。 我在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:

enter image description here

问题: 我想在我的php文件中显示在线用户,并且即使我上次登录时间小于5分钟也总是数字0。但是当我将INTERVAL 5 MINUTE更改为INTERVAL 50000 MINUTE时,它显示在线用户的数量。 我已经尝试了很多,但没有达到任何一点!

2 个答案:

答案 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]);

另请注意您的日期格式字符串,使用大写YH