Почему все значения, возвращаемые при выборке из MySQL PDO, являются строками?

Как исправить ошибку с количеством параметров в запросе INSERT INTO с использованием PDO::exec при включенном и отключенном режиме эмуляции подготовленных запросов?
  • 27 октября 2023 г. 20:48
Ответы на вопрос 2
Все значения, возвращаемые при выборке из MySQL PDO, являются строками, потому что PDO возвращает значения из базы данных в виде строки, независимо от их исходного типа данных в базе данных. Однако PDO предоставляет возможность явного преобразования этих значений в нужные типы данных посредством вызова соответствующих методов, таких как `PDOStatement::fetchColumn()` или `PDOStatement::fetchAll()`.

Что касается ошибки с количеством параметров в запросе `INSERT INTO`, которая может возникнуть при использовании `PDO::exec`, если режим эмуляции подготовленных запросов включен или отключен, то это связано с особенностями работы с PDO::exec.

При включенном режиме эмуляции подготовленных запросов, PDO::exec ожидает, что строка SQL-запроса будет соответствовать синтаксису MySQL, и не поддерживает использование параметров и подстановки значений через плейсхолдеры (например, `:param` или `?`). В этом случае, передавайте значения напрямую в строку запроса.

При отключенном режиме эмуляции подготовленных запросов, PDO::exec поддерживает параметры и плейсхолдеры, но она не возвращает результат выполнения запроса, а только количество затронутых строк.

Рекомендуется использовать подготовленные запросы с использованием метода `PDO::prepare()` и методов `bindValue()` или `bindParam()` для передачи параметров в запрос. Это более безопасно и эффективно, и предотвращает проблемы с количеством параметров в запросе.
После сохранения значения в таблице MySQL оно будет иметь тип поля, в которое оно сохраняется. История выполнения операции вставки (код и флаги) не сохраняется и не влияет на тип данных при выборке.

Дополнительные преобразования типов данных выполняются либо PHP, либо коннектор, который PHP использует для доступа к MySQL. Эти преобразования происходят уже на стороне клиента.

Предполагается, что эмуляция двусторонняя, т.е. преобразования типов выполняются не только при отправке данных к MySQL, но и при получении данных обратно. Если включена настройка PDO::ATTR_EMULATE_PREPARES => true, то дополнительная обработка может изменить тип данных.

Проверьте, не влияет ли изменение этой настройки на другие флаги, в частности PDO::ATTR_STRINGIFY_FETCHES.
Похожие вопросы