PDO プリペアド ステートメントから生の SQL クエリを取得する
プリペアド ステートメントのコンテキストにおける「生の SQL クエリ文字列」の概念は単純ではありません。 PDOStatement::execute() が準備されたステートメントで呼び出される場合、実行される SQL ステートメントは準備されたステートメント自体とは異なります。
パラメーター値で補間された最終的な SQL クエリへのアクセスは、単純なプロセスではありません。準備されたステートメントに固有のものです。パラメータはクライアント側のプリペアド ステートメントと統合されないため、PDO からアクセスできなくなります。
SQL ステートメントは prepare() 操作中にデータベース サーバーに送信されますが、パラメータはexecute( のときに個別に送信されます) )と呼ばれます。 MySQL は、execute() に続く埋め込み値を含む最終 SQL を明らかにする一般的なクエリ ログを維持します。ただし、このログは PDO の外部にあり、「生の」クエリ文字列を表すものではありません。
回避策の 1 つは、PDO 属性 PDO::ATTR_EMULATE_PREPARES を設定することです。このモードでは、PDO は SQL クエリを実行する前にパラメータを SQL クエリに挿入します。ただし、この方法ではプリペアド ステートメントの有効性が損なわれます。
PDOStatement オブジェクトの $queryString プロパティは解決策として考えられるかもしれませんが、これはオブジェクトの初期化中にのみ設定され、パラメーターの補間は反映されません。書き換えられたクエリを機能として公開すると有益ですが、PDO::ATTR_EMULATE_PREPARES が使用されない限り要件は満たされません。
MySQL サーバーの一般クエリ ログを利用すると、書き換えられたクエリが記録されるため、回避策が得られます。ただし、これはロギング中にのみ適用され、クエリの実行中には適用されません。
以上がPDO プリペアド ステートメントから最終的なパラメーター挿入された SQL クエリを取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。