【问题标题】:Date Field Issue in Union query when setting PDO::ATTR_EMULATE_PREPARES false设置 PDO::ATTR_EMULATE_PREPARES false 时联合查询中的日期字段问题
【发布时间】: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-&gt;bindColumn("date", $date); 之后 $stmt-&gt;execute(); 并将PDO::FETCH_BOUND 传递给$stmt-&gt;fetch(),如果你想在我阅读手册时严格正确。

标签: php mysql pdo


【解决方案1】:

感谢@Your Common Sense 检查您的结果,升级解决了这个问题。我现在使用的是 10.4.8-MariaDB 版本,问题已解决。

我运行了 apt-get 以确保我使用的是最新版本的 MariaDB,但忘记检查基础存储库中 Ubuntu 18.04 限制 MaraiDB 的哪个版本。我应该应用我自己的常识。

【讨论】:

    猜你喜欢
    • 2013-10-17
    • 2013-04-22
    • 2015-07-19
    • 2018-08-06
    • 1970-01-01
    • 1970-01-01
    • 2022-07-06
    • 1970-01-01
    • 2012-11-04
    相关资源
    最近更新 更多