MySQL NOW() 与 PHP 时区不匹配



我制作了一个电子邮件验证链接,该链接仅在邮件发送后的 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"; }

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

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

有关如何处理 MySQL 时间的信息

这似乎与时区差异有关,您应该能够更改PHPMySQL的设置,例如基于另一个答案,您可以像下面这样配置 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列上的任何现有值可能仍具有不同的时区(只有新创建的条目才会遵循新的时区设置(。

(基于SitePoint上的一篇文章(

最新更新