web-dev-qa-db-ja.com

PDO :: exec()またはPDO :: query()?

私はこれをPDOコンストラクターに渡すオプション(4番目のパラメーター)の1つとして使用していました:

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

しかし、いくつかのバグのため、Windowsの特定のphpバージョンでは機能しない(5.3では機能しない)ことがわかりました。

次に、$pdo->exec("SET NAMES utf8");を使用して_SET NAMES utf8_を実行する必要があります

または$pdo->query("SET NAMES utf8");

pdoオブジェクトをインスタンス化した直後。だから、どちらを使うべきですか-exec()またはquery()?

29
Dmitri

PDO::EXECを使用すると、返される結果はPDOStatementではなく、影響を受ける行の整数になります。

PDO::QUERYを使用すると、返される結果はPDOStatementになります。

したがって、答えは、データをどのように処理する必要があるかによって異なります。クエリを実行する必要があり、結果に対して何もしない場合は、execを使用してクエリを実行する必要があります。それ以外の場合は、行数、返されたデータ、pdo::queryを使用してから、呼び出しによって返された結果を使用する必要があります。


バグに関しては、あなたが取ることができるいくつかの回避策があります

  • インストールPDO_MYSQL
  • MYSQL_ATTR_INIT_COMMAND1002に置き換えます
  • PHPが更新され、パッチが適用された最新の安定版リリースに更新します。

2番目の問題は、64ビットのOSと一部のWindows構成でいくつかの問題がある可能性があります。

バグ情報: http://bugs.php.net/bug.php?id=47224

48
RobertPitt

PDO :: exec()は、deleteステートメントや 'set'など、結果セットを返さないクエリに使用する必要があります。 PDO :: query()は、結果セットが返されることが予想される場合に使用する必要があります。 PDOStatementオブジェクトが返され、繰り返し処理して個々の行を取得できます。信頼できないソースからのデータをクエリで使用している場合は、準備されたステートメントがどちらの種類のクエリにも最適な方法です(ただし、おそらくそれを知っていました)。

したがって、あなたのケースではPDO :: exec()が正しいでしょう。最後の値としてPDO :: __ construct()にset namesコマンドを渡しても機能しないことは確かですか?それは私のために機能し、私はPHP 5.3を持っています。あなたがやっていることのいくつかのサンプルコードを投稿していただけませんか?

5
Jeremy