首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用php pdo获取当前在线用户

问使用php pdo获取当前在线用户
EN

Stack Overflow用户
提问于 2018-02-05 13:50:45
回答 2查看 613关注 0票数 1

我想让目前的在线用户与他们的最后登录时间的帮助。我在php中的时区是"Asia/Karachi“。

到目前为止我尝试过的:

代码语言:javascript
复制
$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:

代码语言:javascript
复制
$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分钟时,它显示了在线用户的数量。我试了很多,但没有达到任何目的!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-02-06 13:16:14

这很可能是因为您使用亚洲/卡拉奇作为PHP中的默认时区,但是数据库默认为UTC。最好在MySql和PHP中使用UTC,只使用本地时区显示。

如果你必须把你的约会对象存放在亚洲/卡拉奇,你有几个选择。其中之一是将您的MySql时区设置为亚洲/卡拉奇。另一种方法是在PHP中执行日期算法。所以你应该这样做:

代码语言:javascript
复制
$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。

票数 0
EN

Stack Overflow用户

发布于 2018-02-05 14:18:38

请参阅下面的更新:

我相信您的问题是基于MySQL使用与您的PHP不同的时区。如果来自PHP的MySQL连接不是localhost,那么这几乎肯定是正确的。

但是,即使您使用的是localhost,您也可能以某种方式错误地将您的MySQL设置为使用与您的系统不同的时区。

首先,read this post获取MySQL的当前时区,并输出一个小时/分钟的结果:

代码语言:javascript
复制
SELECT TIMEP_FORMAT(TIMEDIFF(NOW(), UTC_TIMESTAMP), '%H%i') as MySQLTime

并将其与从date_default_timezone_get()检索到的PHP值和PHP时间进行比较:

代码语言:javascript
复制
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执行脚本时这样做:

代码语言:javascript
复制
$pdo = new PDO('mysql:host=localhost;dbname=exampletable', 'user', 
       'pass', [PDO::MYSQL_ATTR_INIT_COMMAND =>"SET time_zone = 'Asia/Karachi'"]);

您需要手动更新DataBase中已经设置的所有时间戳,但是添加的新时间戳将添加到正确的时区。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48624094

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档