[解決済み] PDO のプリペアドステートメントから生の SQL クエリ文字列を取得する
質問
PDOStatement::execute() をプリペアドステートメント上で呼び出したとき、実行された生の SQL 文字列を取得する方法はありますか。デバッグのために、これは非常に有用でしょう。
どのように解決するのですか?
パラメータ値を補間した最終的な SQL クエリが必要だということでしょう。 これがデバッグのために有用であることは理解できますが、プリペアド ステートメントが動作する方法ではありません。 パラメータはクライアント側でプリペアド ステートメントと結合されないので、PDO はパラメータと結合されたクエリ文字列にアクセスすることはできないはずです。
SQL 文は prepare() のときにデータベースサーバーに送信され、 パラメータは execute() のときに別々に送信されます。 MySQL の一般的なクエリ ログには、execute() を実行した後に補間された値を含む最終的な SQL が表示されます。 以下は、私の一般的なクエリログからの抜粋です。 PDO からではなく、mysql CLI からクエリを実行しましたが、原理は同じです。
081016 16:51:28 2 Query prepare s1 from 'select * from foo where i = ?'
2 Prepare [2] select * from foo where i = ?
081016 16:51:39 2 Query set @a =1
081016 16:51:47 2 Query execute s1 using @a
2 Execute [2] select * from foo where i = 1
PDO 属性 PDO::ATTR_EMULATE_PREPARES を設定すれば、望みのものを得ることもできます。 このモードでは、PDO はパラメータを SQL クエリに補間し、 execute() したときにクエリ全体を送信します。 これは真のプリペアドクエリではありません。 execute()の前にSQL文字列に変数を補間することで、プリペアドクエリの利点を回避することになります。
afilinaのコメントを再掲します。
いいえ、テキスト形式の SQL クエリは ではなく は実行時にパラメータと組み合わされます。ですから、PDO が表示するものは何もありません。
内部的には、PDO::ATTR_EMULATE_PREPARES を使用すると、PDO は準備と実行を行う前に SQL クエリのコピーを作成し、パラメータ値をそこに補間します。しかし、PDO はこの修正された SQL クエリを公開しません。
PDOStatement オブジェクトには $queryString というプロパティがありますが、これは PDOStatement のコンストラクタにのみ設定され、クエリがパラメータで書き直されたときに更新されるわけではありません。
PDOに対して、書き換えられたクエリを公開するように要求するのは、妥当な機能要求でしょう。しかし、それでも PDO::ATTR_EMULATE_PREPARES を使用しない限り、quot; complete" クエリを得ることはできません。
この場合、パラメータプレースホルダを含むプリペアドクエリでさえ、サーバ上で書き直され、パラメータ値がクエリ文字列に埋め戻されるからです。しかし、これはロギング中にのみ行われ、クエリ実行中には行われません。
関連
-
[解決済み】Phpのincludeが機能しない? 関数がincludeされない
-
[解決済み] Uncaught SyntaxError: JSON の位置 1 に予期しないトークン o があります。
-
[解決済み] SQL ServerでSELECTからUPDATEする方法とは?
-
[解決済み] SQL Server で複数行のテキストを 1 つのテキスト文字列に連結する方法
-
[解決済み] ...値に挿入する ( SELECT ... FROM ... )
-
[解決済み] SQLのIN句をパラメータ化する
-
[解決済み] クエリビルダーのSQLクエリを文字列として出力するにはどうすればよいですか?
-
[解決済み] PDOのプリペアドステートメントは、SQLインジェクションを防ぐのに十分ですか?
-
[解決済み】PHPの'foreach'は実際どのように動作するのですか?
-
[解決済み] リファレンス - このシンボルはPHPで何を意味するのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Weird PHP error: 'Can't use function return value in write context'.
-
[解決済み] PHP & MySQL: mysqli_num_rows() expects parameter 1 to be mysqli_result, boolean given [重複] PHP & MySQL: mysqli_num_rows() expects parameter 1 to be mysqli_result, boolean given.
-
[解決済み】DateTimeクラスのオブジェクトを文字列に変換できない
-
[解決済み】未定義の関数mysql_query()をLoginで呼び出す【重複
-
[解決済み] 警告:mysqli_fetch_array()は、パラメータ1がmysqli_resultであることを期待する、オブジェクトはで指定された。
-
[解決済み】count()パラメータは配列かlaravelのcountableを実装したオブジェクトでなければならない
-
[解決済み] PHP - ストリームを開くのに失敗しました : そのようなファイルまたはディレクトリがありません。
-
[解決済み】Fatal error: mysqli_result 型のオブジェクトは使用できません [終了] 。
-
[解決済み】mysqli::query(): mysqli をフェッチできない
-
[解決済み] PHP with PDOで、最終的なSQLのパラメトリッククエリを確認する方法は?[重複している]。