【发布时间】:2021-05-09 03:58:14
【问题描述】:
我有一个问题我没有找到解决方案,使用 PDO 的 PHP 进行的相同查询在直接从 MySQL 控制台执行时返回不同的结果(来自控制台的结果与预期一致)。
从 PDO 它返回 2 个结果和 MySQL 3 个结果。
我会给出一些上下文:
数据:
SELECT id, startDate, endDate FROM publications_elements;
+----+---------------------+---------------------+
| id | startDate | endDate |
+----+---------------------+---------------------+
| 1 | 2021-05-08 21:00:00 | NULL |
| 2 | 2021-05-08 00:00:00 | 2021-05-08 20:00:00 |
| 3 | NULL | 2021-05-08 23:20:00 |
| 4 | NULL | NULL |
+----+---------------------+---------------------+
有问题的查询
SELECT
id,
startDate,
endDate
FROM publications_elements
WHERE
(UNIX_TIMESTAMP(startDate) <= 1620531853 OR startDate IS NULL) AND
(UNIX_TIMESTAMP(endDate) > 1620531853 OR endDate IS NULL)
MySQL 控制台中的结果
+----+---------------------+---------------------+
| id | startDate | endDate |
+----+---------------------+---------------------+
| 1 | 2021-05-08 21:00:00 | NULL |
| 3 | NULL | 2021-05-08 23:20:00 |
| 4 | NULL | NULL |
+----+---------------------+---------------------+
PHP PDO 的结果
+----+---------------------+---------------------+
| id | startDate | endDate |
+----+---------------------+---------------------+
| 1 | 2021-05-08 21:00:00 | NULL |
| 4 | NULL | NULL |
+----+---------------------+---------------------+
有什么想法吗?
提前致谢。
编辑 1
PHP 中的代码
$timestamp = (new \DateTime)->getTimestamp();
$SQL = "SELECT id, startDate, endDate FROM publications_elements WHERE (UNIX_TIMESTAMP(startDate) <= {$timestamp} OR startDate IS NULL) AND (UNIX_TIMESTAMP(endDate) > {$timestamp} OR endDate IS NULL)";
$prepared = $PDOInstance->prepare($SQL);
$prepared->execute();
$result = $prepared->fetchAll(\PDO::FETCH_OBJ);
【问题讨论】:
-
根据您的示例数据,MySQL 查询返回错误的结果:db-fiddle.com/f/j4wQzSpJn5nUXaEc5aXQoh/0。我怀疑您可能对时区有疑问 - 您可能想在 MySQL 服务器上的演示中尝试我的第一个查询,看看您得到什么结果...