Как использовать функцию Mysql If для оценки столбца datetime? - PullRequest
1 голос
/ 27 сентября 2019

Я хочу оценить с помощью подготовленного оператора php mysqli, будет ли столбец даты и времени истечения более чем равен дате Now(), прежде чем возвращать имя пользователя в столбце имени.Но я получаю неверный результат с php, когда expire_date 2019-09-27 01:00:00 и Now() 2019-09-26 23:58:02 я получаю false.Что странно, я получаю желаемый результат, когда набираю запрос в терминале.

Использование только запросов Sql:

mysql> SELECT IF(Now()<=expire_date, for_user, 'false') FROM forgottenleafttokens WHERE(for_user='herm' AND pass_token='9c3d5eee11f1c7cacdf676b46df87bccb650783d66afc62aee2b7f6e9382aade4ca4e1840896f788b4cff4342b4dec0842f3c577f5f61bf17fd538c7f34ca69a');
+-------------------------------------------+
| IF(Now()<=expire_date, for_user, 'false') |
+-------------------------------------------+
| herm                                      |
+-------------------------------------------+
1 row in set (0.00 sec)

Использование php:

            $query = "SELECT IF(Now()<=expire_date, for_user, 'false') FROM forgottenleafttokens WHERE(for_user=? AND pass_token=?)";
            $stmt = $db->prepare($query);
            $stmt->bind_param('ss', $us_er, $tok_en);
            $stmt->execute();

            $stmt->bind_result($user);
            $result = "";
            if ($stmt->num_rows > 0) {
                while ($stmt->fetch()) {
                    $result = $user;

                } return $result;
            } else {
                return false;
            }

Может кто-нибудь подсказать, что не так с моим утверждением php подготовленным, которое я используюс запросом Sql?

1 Ответ

1 голос
/ 27 сентября 2019

В каком часовом поясе настроен сервер mysql и какой тип expire_date?Если это TIMESTAMP, он подстраивается под часовой пояс, а если это DATETIME, то это не так.Я не вижу ничего неправильного в запросе, однако код немного многословен и не повторяет набор результатов правильно.Я попытался немного его почистить, предполагая, что это когда-нибудь даст только 1 или 0 результатов.Пример: LIMIT 1;

            $result = false;
            if ($stmt->fetch()) {
                $result = $user;
            }
            return $result;

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

SELECT IF(NOW() <= CONVERT_TZ(expire_date, 'UTC', 'America/New_York'), for_user, 'false') ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...