我制作了一个电子邮件验证链接,该链接仅在邮件发送后的 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 时间的信息
这似乎与时区差异有关,您应该能够更改PHP
和MySQL
的设置,例如基于另一个答案,您可以像下面这样配置 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上的一篇文章(