MYSQL_ATTR_DIRECT_QUERY
私は、デフォルトで PHP PDO がその MySQL ドライバーに対して有効になっているフラグを持っているという事実に遭遇しました (文書化がかなり不十分です) 。
これは、準備済みステートメントを実際に使用するのではなく、準備済みステートメントの動作をエミュレートすることを意味します。これは、クライアント側のプレースホルダーをエスケープされた値に置き換え、完全なクエリをそのままデータベースに送信することを意味します。
古いバージョンの MySQL では、プリペアド ステートメントがクエリ キャッシュをバイパスするため、これを行うには十分な理由がありました。しかし、これはしばらくの間そうではありませんでした。アプリからデータベースへのラウンドトリップの回数が減るため、パフォーマンスがわずかに向上しますが、それだけの価値があるかどうかはわかりません。
この方法を使用することの明らかな欠点は、クライアント側のエスケープにまだ依存していることです。これは通常、悪い考えです。mysqli_real_escape_string
過去に、文字セットの設定ミスが原因で無効な文字がクエリに許可されたという奇妙な問題に遭遇しました。このようなことが二度と起こらないようにしたいです。
この問題については、半分真実と表面的なコメントしか見つかりません (たとえば、「はい、有効にできます」または「「問題」が発生します」など)。これをオフにしない本当の理由をお探しですか? とにかくエミュレートされた準備済みステートメントと互換性がないのに、MySQL/PDO で実際の準備済みステートメントを使用していますか?
私が尋ねている理由の 1 つは、PDO に依存する PHPActiverecord を使用しているためです。エミュレートされた準備済みステートメントをオフにすると、特定のエッジケースなどで微妙に動作が変わるため、本番環境で突然中断したくありません。
(補足として、誰かがそれを持ち出す前に:PDO::ATTR_EMULATE_PREPARES
MySQLドライバー用に実際に(完全に)実装されていないため、チェックは機能しPDO::MYSQL_ATTR_DIRECT_QUERY
ません。代わりにチェックする必要があります。ええ、それには時間がかかりました。)
明確にするために:この動作をオフにしない正当な理由があるかどうか疑問に思っています。そもそも気にしてはいけない理由ではありません。