PDO :: exec () или PDO :: query ()? - PullRequest
       2

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

29 голосов
/ 12 февраля 2011

Раньше этот параметр передавался конструктору PDO в качестве одного из параметров (4-й параметр):

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

Ответы [ 2 ]

48 голосов
/ 12 февраля 2011

При использовании PDO::EXEC возвращается не 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

5 голосов
/ 12 февраля 2011

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

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

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