PHP で、パラメータ化されたクエリを使用して PDO を使用して MySQL データベースにアクセスする場合、(すべてのトークンを置き換えた後) 最終的なクエリを確認するにはどうすればよいですか?
データベースによって実際に何が実行されるかを確認する方法はありますか?
PHP で、パラメータ化されたクエリを使用して PDO を使用して MySQL データベースにアクセスする場合、(すべてのトークンを置き換えた後) 最終的なクエリを確認するにはどうすればよいですか?
データベースによって実際に何が実行されるかを確認する方法はありますか?
だから私は最終的に記録のための完全な解決策を得るために私自身の質問に答えると思います. しかし、この手がかりを提供してくれた Ben James と Kailash Badu に感謝しなければなりません。
簡単な回答
Ben James が述べたように、いいえ。
トークンを含むクエリとパラメータが別々にデータベースに送信されるため、完全な SQL クエリは PHP 側には存在しません。完全なクエリが存在するのはデータベース側だけです。
PHP 側でトークンを置換する関数を作成しようとしても、置換プロセスが SQL プロセスと同じであることは保証されません (token-type、bindValue と bindParam などのトリッキーなもの)。
回避策
これは、Kailash Badu の回答について詳しく説明する場所です。すべての SQL クエリをログに記録することで、サーバー上で実際に何が実行されているかを確認できます。mySQL では、これは my.cnf (または Wamp サーバーの場合は my.ini) を更新し、次のような行を追加することで実行できます。
log=[REPLACE_BY_PATH]/[REPLACE_BY_FILE_NAME]
これを本番環境で実行しないでください!!!
使えるかもPDOStatement->debugDumpParams
。PHP ドキュメントを参照してください。
パラメータ化された値を持つ準備済みステートメントを使用することは、SQL の文字列を動的に作成するための単なる別の方法ではありません。データベースで準備済みステートメントを作成し、パラメーター値のみを送信します。
したがって、おそらくデータベースに送信されるのは、PREPARE ...
、 then SET ...
、および finalEXECUTE ...
です。
同等の結果が得られたとしても、のような SQL 文字列を取得することはできませんSELECT * FROM ...
。これは、そのようなクエリが実際にデータベースに送信されたことがないためです。
クエリログをチェックして、プリペアドステートメントとして実行された正確なクエリを確認します。
実際のクエリを印刷するために私がしたことは少し複雑ですが、うまくいきます:)
私のステートメントに変数を割り当てるメソッドには、次のような別の変数があります。
$this->fullStmt = str_replace($column, '\'' . str_replace('\'', '\\\'', $param) . '\'', $this->fullStmt);
ここで:
$column
is my token
$param
は token に割り当てられる実際の値
$this->fullStmt
です は my print only statement で置き換えられたトークン
それが行うことは、実際の PDO 割り当てが発生したときにトークンを値に置き換えるだけです。
私があなたを混乱させず、少なくとも正しい方向に向けられたことを願っています.
誰かが私が間違っていることを証明してくれることを願っていますが、あなたができるとは思いません。
クエリを印刷できることはわかっています。その toString メソッドは、置換なしで sql を表示します。複雑なクエリ文字列を作成している場合は便利ですが、値を含む完全なクエリは得られません。
pdo を使用するときに最終的なクエリ テキストを表示する最も簡単な方法は、特別なエラーを作成してエラー メッセージを表示することだと思います。その方法はわかりませんが、pdoを使用するyiiフレームワークでSQLエラーを作成すると、クエリテキストが表示されます