私はこれを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()?
PDO::EXEC
を使用すると、返される結果はPDOStatement
ではなく、影響を受ける行の整数になります。
PDO::QUERY
を使用すると、返される結果はPDOStatement
になります。
したがって、答えは、データをどのように処理する必要があるかによって異なります。クエリを実行する必要があり、結果に対して何もしない場合は、exec
を使用してクエリを実行する必要があります。それ以外の場合は、行数、返されたデータ、pdo::query
を使用してから、呼び出しによって返された結果を使用する必要があります。
バグに関しては、あなたが取ることができるいくつかの回避策があります
PDO_MYSQL
MYSQL_ATTR_INIT_COMMAND
を1002
に置き換えます2番目の問題は、64ビットのOSと一部のWindows構成でいくつかの問題がある可能性があります。
PDO :: exec()は、deleteステートメントや 'set'など、結果セットを返さないクエリに使用する必要があります。 PDO :: query()は、結果セットが返されることが予想される場合に使用する必要があります。 PDOStatementオブジェクトが返され、繰り返し処理して個々の行を取得できます。信頼できないソースからのデータをクエリで使用している場合は、準備されたステートメントがどちらの種類のクエリにも最適な方法です(ただし、おそらくそれを知っていました)。
したがって、あなたのケースではPDO :: exec()が正しいでしょう。最後の値としてPDO :: __ construct()にset namesコマンドを渡しても機能しないことは確かですか?それは私のために機能し、私はPHP 5.3を持っています。あなたがやっていることのいくつかのサンプルコードを投稿していただけませんか?