Раньше я использовал это как один из параметров (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
вторая проблема может иметь некоторые проблемы в 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. Не могли бы вы разместить еще несколько примеров кода, что вы делаете?