[PHP-users 32458] Re: PDO プレイスホルダにバインドできない

kanonbell kanonbell.sky @ gmail.com
2007年 7月 17日 (火) 22:40:43 JST


こんばんは。

解決策は提示できませんが。

> 開発作業では、とりあえず、SQL文を文字列連結で組み立てて、prepareに渡すよ
> うにしました。以下のような感じです。
>
> $sqlStatement = "SELECT * FROM TBL_MEMBER WHERE MEMBER_ID='".$id."'";
> $stt = $db->prepare($sqlStatement);
> $stt -> execute();

> これで回避できています。プレースホルダは経由するので、クォート処理はして
> くれていると思います。でも、ちょっと格好が悪いです。なんとか王道に戻りた
> いと願っています。

えーと、Prepared Statementとして実行されはするだろうけど、パラメータバインドしてないし、
意味がない気がするんですが。。。

Prepared Statementは
・クエリ本文とパラメータを別々にRDBMSに渡す。
・RDBMSはクエリ本文をあらかじめコンパイルしておくので、再利用される場合に速度向上する
・パラメータがそれと認識できる形でRDBMSに渡されるので、クエリ本文に含めるときと異なり、
 メタ文字のエスケープなどを考慮する必要がない。
ってものだと思ってます。

パラメータの存在しないクエリをただ投げるだけなら例のような書き方でいいと思いますが、
パラメータ渡すならその書き方は、速度向上もSQLインジェクション対策の恩恵も受けられない
んじゃないでしょうか?

$id = "0 OR 1=1";

とか値入れられたら終わっちゃうような。

PDOのこと知らないので、その書き方で問題ないのならいいのですが。。


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