Ошибка поля даты в запросе объединения при установке PDO :: ATTR_EMULATE_PREPARES false - PullRequest
2 голосов
/ 02 октября 2019

При выполнении подготовленного запроса PDO с параметром emulate_prepares, равным false, со столбцом даты и оператором объединения поле даты возвращается некорректно (например, ожидаемый результат: 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

Дата будет возвращена правильно, если я удалю Union.

1 Ответ

0 голосов
/ 02 октября 2019

Спасибо @Your Здравый смысл за проверку вашего конца, обновление решило проблему. У меня сейчас версия 10.4.8-MariaDB, и проблема решена.

Я запустил apt-get, чтобы убедиться, что у меня последняя версия MariaDB, но забыл проверить, какая версия Ubuntu 18.04 ограничивала MaraiDBна базе репо. Я должен был применить свой здравый смысл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...