【问题标题】:Get Currently online users with php pdo使用 php pdo 获取当前在线用户
【发布时间】:2018-07-15 09:34:47
【问题描述】:

我想在他们上次登录时间的帮助下获取当前在线用户。 我在 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;

登录过程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 文件中显示在线用户,即使我上次登录时间小于 5 分钟,也总是有数字 0。但是当我将 INTERVAL 5 MINUTE 更改为 INTERVAL 50000 MINUTE 时,它会显示在线用户的数量。 我已经尝试了很多,但没有达到任何目的!

【问题讨论】:

  • 您完全错误地使用了准备好的语句。
  • 您的 MySQL 是否托管在与您的网站计算登录时间相同的时区?
  • AND last_login_time IS NOT NULL 我假设您将表设置为将last_login_time 设置为默认为NULL
  • 如何检查我是否也想知道这一点?
  • 请说明您是如何设置 MySQL 字段的?

标签: php sql pdo timezone


【解决方案1】:

请参阅底部的更新:

相信您的问题是基于 MySQL 使用与您的 PHP 不同的时区。如果您从 PHP 的 MySQL 连接是 not 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 中的时区是“亚洲/卡拉奇”。

这是你的问题。您的 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'"]);

您将需要手动更新已在数据库中设置的所有时间戳,但添加的新时间戳将添加到正确的时区。

【讨论】:

  • 非常感谢您的回答。经过长时间的研究,我终于解决了。我的 php 时间与 mysql 时间不同。按照上述步骤,它解决了问题。跨度>
  • 我有一个类似的问题。而不是在 php.ini 中更改时区。我怎样才能使它等于服务器的时区,假设用户来自欧洲时区它的时间应该不同。
  • 默认情况下,PHP 使用提供给它的服务器时区。如果不是,则使用php.ini 中指定的时区。服务器时区不会根据访问者所在的位置而改变。
【解决方案2】:

这很可能是因为您在 PHP 中使用 Asia/Karachi 作为默认时区,但您的数据库默认为 UTC。最好在MySql和PHP中都使用UTC,只使用本地时区进行显示。

如果您必须将日期存储在亚洲/卡拉奇,您有几个选择。一种是将您的 MySql 时区设置为 Asia/Karachi。另一种是在 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

【讨论】:

  • 感谢您这么直截了当的回答。完美运行!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-18
  • 2017-06-22
相关资源
最近更新 更多