Подтвердить что ты не робот

PDO:: exec() или PDO:: query()?

Я использовал это как один из параметров (4-й параметр), переданный конструктору PDO:

$aOptions[PDO::MYSQL_ATTR_INIT_COMMAND] = "SET NAMES utf8";

Но только что обнаружил, что он не работает на некоторых версиях PHP в Windows (не работает в 5.3) из-за некоторой ошибки.

Теперь мне нужно запустить SET NAMES utf8 с помощью $pdo->exec("SET NAMES utf8");

или $pdo->query("SET NAMES utf8");

сразу после создания объекта pdo. Итак, какой из них я должен использовать - exec() или query()?

4b9b3361

Ответ 1

При использовании PDO::EXEC возвращаемый результат не относится к PDOStatement, а целому числу затронутых строк.

При использовании PDO::QUERY возвращаемый результат является PDOStatement.

Итак, ответ зависит от того, что вам нужно делать с данными, если вам нужно запускать запрос и ничего не делать с результатами, тогда вы должны использовать exec для выполнения запроса, иначе вам понадобится количество строк, возвращаемые данные, вы должны использовать PDO::QUERY, а затем использовать результаты, возвращаемые вызовом.


в отношении ошибки есть несколько работ, которые вы можете взять

  • Установить PDO_MYSQL
  • Замените MYSQL_ATTR_INIT_COMMAND на 1002
  • Обновите свой PHP до последней стабильной версии, где она была передана и исправлена.

у второй проблемы могут возникнуть проблемы с 64-битной ОС и некоторыми конфигурациями окон.

Информация об ошибке: http://bugs.php.net/bug.php?id=47224

Ответ 2

PDO:: exec() следует использовать для запросов, которые не возвращают набор результатов, например, оператор delete или "set". PDO:: query() следует использовать, когда вы ожидаете возвращения результата. Он возвращает для вас объект PDOStatement, который вы можете перебирать для получения отдельных строк. Обратите внимание, что если вы используете данные из ненадежного источника в ваших запросах, подготовленные операторы будут лучшим способом для любого запроса (но вы, вероятно, знали это).

Итак, в вашем случае PDO:: exec() будет правильным. Вы уверены, что если передать команду set names в PDO:: __ construct(), поскольку последнее значение не работает? Он работает для меня, и у меня PHP 5.3 на Windows. Не могли бы вы разместить еще несколько примеров кода, что вы делаете?