[PHP-users 32836] Re: PDO関数がどのように実行されたかを知るには?

kanonbell kanonbell.sky @ gmail.com
2007年 11月 10日 (土) 00:30:12 JST


こんばんは。
よっぱら〜〜です。。

> 疑問符プレースホルダを伴ったプリペアードステートメントで
> bindParam() などを用いてバインドし、そのあと execute() していますが、
> この bindParam() などがどのようにコールされ、結果的にどのような SQL 文になったのかを
> PHP 側で明示的に知る方法ってあるのでしょうか?

Preopared Statementをエミュレートしている場合であれば、
PDO関数でそれなりのSQL文を組み立てているでしょうから、
手段自体はあるでしょう。

実際にどうやるかは思いつかなかったので、tuchidaさんすごい!
ですけれど。

対してエミュレートしてない場合。
そもそもPrepared Statementは、SQL分の構文解析と実行プランの策定
あたりをパラメータを除いたSQL分で"準備した"状態で待機するものだと思います。
今はセキュリティ対策目的での利用が多いものの、この機能の本来の目的は
この処理を事前に行えることによる速度向上でしょう。
ある本のどの文章を検索するか分からない状態と、ページ番号で指定されることが
分かっている状態との違い、みたいなもんでしょうか。

この状態からパラメータを与えられた後に、わざわざ一度SQL文を組み立てなおす
オプティマイザってあるのかな?とちょっと疑問です。
RDBMSによってはこの実行プランをRDBMSの管理ツール上などで確認する方法は
提供されていることも多いでしょうか、SQL文自体は存在しないんじゃないでしょうか。

私はPDOではなくADOdbを使っています。
デバッグ出力を行うと渡されたパラメータとエミュレートされたSQL文がExecuteするごとに
表示されるので、多分そういうものを所望されているのだと思いますが、ちゃんとPrepared
StatementしてるRDBMSの場合、コードの書いてある以上の出力は行えないんじゃないかな、
という気がします。

MSSQLを使用しているので、用語などはこれに準じています。
RDBMSをきちんと理解できている訳ではないので、突っ込みどころがあればご指摘ください。


PHP-users メーリングリストの案内