【问题标题】:MySQL NOW() does not match PHP timezoneMySQL NOW() 与 PHP 时区不匹配
【发布时间】:2020-02-16 02:32:07
【问题描述】:

我创建了一个电子邮件验证链接,该链接仅在发送邮件后的 10 分钟内有效,但我下面给出的代码无效。

等等,我在 StackOverflow 上显示了所有相关线程,当然我得到了与问题相关的相同帖子,但我也做了那个结果答案,但它对我不起作用,所以我发布了这个问题,可能有人有同样的问题,并且它将对其他人有所帮助。

请不要将其标记为重复和处于审核模式,并尝试理解我的查询。

请帮助我解决这个问题以及什么是正确的代码。 :(

我的代码如下:-

其他代码

date_default_timezone_set('Asia/Kolkata');
tokenExpire formats: (new DateTime('+10 minutes'))->format('Y-m-d H:i:s') 

数据库结构[注册名称]

-----------------------------------------------------
Email            |   token    | tokenExpire          |
----------------------------------------------------
abcd@domain.com  | {randNum}  | 2019-10-19 09:42:10  |
-----------------------------------------------------

PDO 声明

$sql = $con->prepare("SELECT `Email`,`token` FROM `signup` WHERE Email= :1 AND token= :2 AND tokenExpire > NOW()");
    $sql->execute(array(
       ':1' => $emailid,
       ':2' => $tokenum
    ));

if ($sql->rowCount() > 0) { echo "Link Is Valid"; }
    else { echo "Link Expired"; }

我希望它必须代表我的代码显示时间过期或有效信息,但它不起作用,并且即使时间过去也显示链接有效。

【问题讨论】:

标签: php mysql time pdo


【解决方案1】:

这似乎与时区差异有关,您应该可以更改PHPMySQL的设置,例如基于another answer,您可以配置PHP如下:

<?php
define('TIMEZONE', 'UTC');
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 时区现在在您的应用程序中同步。无需使用php.ini 或 MySQL 控制台!

但您可能希望在向用户显示之前转换时区,例如如下所示:

/**
 * Converts server date to user's local-date.
 */
function GetUserDate($date, $format = 'n/j/Y g:i A', $userTimeZone = 'Asia/Kolkata') {
  // Use previous TIMEZONE constant just in case
  // (If "date_default_timezone_set(TIMEZONE)" is called 
  // it's not required to pass "DateTimeZone" in below line)
  $dateTime = new DateTime($date, new DateTimeZone(TIMEZONE));

  $dateTime->setTimezone(new DateTimeZone($userTimeZone));
  return $dateTime->format($format);
}

注意: 以上应该可以解决您的问题,但您的 tokenExpire 列上的任何现有值可能仍具有不同的时区(只有新创建的条目将遵循您的新时区设置) .

(基于article on SitePoint

【讨论】:

  • 当我想显示 Asia India TimeZone 时发生了什么,有什么办法可以转换它?
  • 更新了! (它现在使用UTCGetUserDate(...) 显示了以后如何转换它,但你可以为Delhi 简单地使用Asia/Kolkata 而不是UTC,我的意思是如果你不喜欢能够根据每个用户的地理位置显示日期)。
【解决方案2】:

看起来您有不同的 Apache(或您正在运行的任何东西)和 MySQL 时区。 编写一个简短的脚本,更改 PHP 时区,打印 DateTime 值,同时使用 NOW() 将行插入 MySQL 并检查 MySQL 中的时间是否与打印的时间不同。

Info how to deal with MySQL time

【讨论】:

  • 我也认为这个问题来自时区。但是我如何解决这个问题,我访问了您的链接但不明白。
  • 您需要更改 MySQL 时区设置,更改方式取决于您使用的系统以及您拥有的访问权限。快速解决方法:stackoverflow.com/a/34428852/11222393
猜你喜欢
  • 2014-04-16
  • 2012-05-30
  • 2017-12-09
  • 2014-06-02
  • 2012-04-14
  • 2012-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-05
相关资源
最近更新 更多