150

PHP で、パラメータ化されたクエリを使用して PDO を使用して MySQL データベースにアクセスする場合、(すべてのトークンを置き換えた後) 最終的なクエリを確認するにはどうすればよいですか?

データベースによって実際に何が実行されるかを確認する方法はありますか?

4

9 に答える 9

58

だから私は最終的に記録のための完全な解決策を得るために私自身の質問に答えると思います. しかし、この手がかりを提供してくれた 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]

これを本番環境で実行しないでください!!!

于 2009-11-28T21:20:37.060 に答える
34

使えるかもPDOStatement->debugDumpParamsPHP ドキュメントを参照してください。

于 2009-12-13T05:46:37.250 に答える
30

パラメータ化された値を持つ準備済みステートメントを使用することは、SQL の文字列を動的に作成するための単なる別の方法ではありません。データベースで準備済みステートメントを作成し、パラメーター値のみを送信します。

したがって、おそらくデータベースに送信されるのは、PREPARE ...、 then SET ...、および finalEXECUTE ...です。

同等の結果が得られたとしても、のような SQL 文字列を取得することはできませんSELECT * FROM ...。これは、そのようなクエリが実際にデータベースに送信されたことがないためです。

于 2009-11-23T22:17:33.603 に答える
10

クエリログをチェックして、プリペアドステートメントとして実行された正確なクエリを確認します。

于 2009-11-25T01:49:20.427 に答える
1

実際のクエリを印刷するために私がしたことは少し複雑ですが、うまくいきます:)

私のステートメントに変数を割り当てるメソッドには、次のような別の変数があります。

$this->fullStmt = str_replace($column, '\'' . str_replace('\'', '\\\'', $param) . '\'', $this->fullStmt);

ここで:
$columnis my token
$paramは token に割り当てられる実際の値
$this->fullStmtです は my print only statement で置き換えられたトークン

それが行うことは、実際の PDO 割り当てが発生したときにトークンを値に置き換えるだけです。

私があなたを混乱させず、少なくとも正しい方向に向けられたことを願っています.

于 2009-11-23T22:38:11.150 に答える
0

誰かが私が間違っていることを証明してくれることを願っていますが、あなたができるとは思いません。

クエリを印刷できることはわかっています。その toString メソッドは、置換なしで sql を表示します。複雑なクエリ文字列を作成している場合は便利ですが、値を含む完全なクエリは得られません。

于 2009-11-23T22:03:21.017 に答える
-1

pdo を使用するときに最終的なクエリ テキストを表示する最も簡単な方法は、特別なエラーを作成してエラー メッセージを表示することだと思います。その方法はわかりませんが、pdoを使用するyiiフレームワークでSQLエラーを作成すると、クエリテキストが表示されます

于 2013-06-04T11:39:02.283 に答える