0

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

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

4

2 回答 2

0

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

信息如何处理 MySQL 时间

于 2019-10-19T09:09:20.270 回答
0

这似乎与时区差异有关,您应该能够更改两者的设置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.iniMySQL 控制台!

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

/**
 * 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 上的一篇文章

于 2019-10-19T09:24:31.727 回答