【发布时间】:2019-10-02 08:26:44
【问题描述】:
在 emulate_prepares 设置为 false、日期列和联合语句的情况下执行 PDO 准备查询时,返回的日期字段格式错误(例如,预期结果:2019-10-02,实际结果:\xe3\x07\n \x02)
在 emulate_prepares 设置为 true 的情况下,查询按预期运行。
PHP 版本:7.2.19-0ubuntu0.18.04.2 数据库版本:10.1.41-MariaDB-0ubuintu0.18.04.1
我在下面提供了一个非常简单的查询来演示该问题,但通常此查询针对具有真实数据的实际表运行。两种情况都存在相同的问题。
<?php
$options= [
PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_BOUND,
PDO::ATTR_EMULATE_PREPARES => FALSE
];
$db = new PDO('mysql:host=localhost;dbnam=db;charset=utf8', user, password, $options);
$stmt = $db->prepare("
SELECT CURRENT_DATE AS 'date' FROM DUAL
UNION ALL
SELECT CURRENT_DATE FROM DUAL");
$stmt->bindColumn("date", $date);
$stmt->execute();
while($stmt->fetch())
{
print $date."<br>";
}
Results for PDO:ATTR_EMULATE_PREPARES = FALSE
�
�
Results for PDO:ATTR_EMULATE_PREPARES = TRUE
2019-10-02
2019-10-02
如果我删除联合,日期会正确返回。
【问题讨论】:
-
无法确认。两个返回日期。 10.3.17-MariaDB-日志
-
尝试调用
$stmt->bindColumn("date", $date);之后$stmt->execute();并将PDO::FETCH_BOUND传递给$stmt->fetch(),如果你想在我阅读手册时严格正确。