MySQL NOW () не соответствует часовому поясу PHP - PullRequest
0 голосов
/ 19 октября 2019

Я создал ссылку для проверки электронной почты, в которой ссылка будет действительна только в течение следующих 10 минут с момента отправки письма, но мой код, указанный ниже, не работает.

Подождите, я показываю все связанные темыв StackOverflow и offcourse я получил одно и то же сообщение, связанное с вопросом, но я также делаю ответ с тем же результатом, но он не работает для меня, так что я разместил этот вопрос, если у кого-то возникнет такая же проблема, и это поможет другим.

Пожалуйста, не помечайте его как дублирующий и находящийся в режиме просмотра, и попытайтесь понять мой запрос.

Пожалуйста, помогите мне, как исправить эту проблему и какой код был бы правильным. : (

МОЙ код ниже: -

Другой код

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

DBСтруктура [имя как подписка]

-----------------------------------------------------
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"; }

Я ожидаю, что он должен показывать истечение времени или действительную информацию имени моего кода, ноэто не работает, и покажите, что Ссылка действительна, даже когда время прошло.

Ответы [ 2 ]

0 голосов
/ 19 октября 2019

Похоже, это связано с различиями часовых поясов, и вы должны иметь возможность изменять настройки 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 )

0 голосов
/ 19 октября 2019

Похоже, у вас разные часовые пояса в Apache (или где бы вы ни работали). Сделайте короткий скрипт, измените часовой пояс PHP, напечатайте значение DateTime и одновременно вставьте строку в MySQL с помощью NOW () и проверьте, отличается ли время в MySQL от напечатанного.

Информация о том, как обращаться сMySQL time

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...