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 ()?

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

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

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


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

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

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

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

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

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