问题

我想在返回名称列中的用户名之前,使用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;
            }
 

有人可以指出我使用Sql查询的php准备语句有什么问题吗?

  最佳答案

什么时区是运行的mysql服务器设置,什么是export_date的类型?如果它是TIMESTAMP,它正在调整时区,如果它是DATETIME,它不是.但是,我在查询中没有看到任何错误,代码有点详细,而不是正确迭代结果集.我试图清除它一点假设这只会返回1或0结果.例如:限制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') ...
 

  相同标签的其他问题

phpmysqlsqlmysqli