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

Kimio Mizuguchi mizuguchi.kimio @ ytv.home.ne.jp
2007年 7月 17日 (火) 10:40:09 JST


lets.skeptic様、レスポンスありがとうございます。

記載したのは正しい結果を得るSQL文です。
?も試しましたが、やはりバインドできません。
同じスキーマ、同じデータをMySQLに作ってdsnだけをそちらに切り替えて試すと
バインドできます。SQLLiteでは試していませんが、Oracleに限ってバインドで
きないのではないかと感じています。
Oracleがバインドについて全く無反応でなのかなと気になって

$stt = $db -> prepare('SELECT * FROM TBL_MEMBER WHERE MEMBER_ID=:id');
$targetId = $inputId;
$stt -> bindParam(':id',$targetId);
$stt -> execute();

の3行目をコメントにすると、未解決のバインドがある...というエラーがでま
した。つまり、バインドの処理は動こうとしているようです。
ちなみに、3行目の':id'を'id'に変えてみたのですが、それでエラーが出ること
はなく、':id'のときと同じ結果でした。

開発作業では、とりあえず、SQL文を文字列連結で組み立てて、prepareに渡すよ
うにしました。以下のような感じです。

$sqlStatement = "SELECT * FROM TBL_MEMBER WHERE MEMBER_ID='".$id."'";
$stt = $db->prepare($sqlStatement);
$stt -> execute();

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

On Tue, 17 Jul 2007 09:31:19 +0900
"Let's Skeptic" <lets.skeptic @ gmail.com> wrote:

> lets.skepticです。
> 
> 解決方法ではありませんが情報提供として。
> 私もPDO+SQLiteで同様の現象になりました。
> 私の場合、ラベルではなく?を用いていて、
> executeで配列引数を与える方法でした。
> 
> ところでメールに記載されたSQL文は失敗するSQL文そのものでしょうか?
> 私の場合は、SQL文自体が当初想定していたものと違ったので、
> 正しい結果を得るSQL文に変更したところ正常に動作しました。
> 
> #prepareのバグ(キャッシュとか?)か、
> #APC辺りが怪しいんじゃないかと疑っていますが、再現していないのでなんとも。
> 
> 07/07/14 に Kimio Mizuguchi<mizuguchi.kimio @ ytv.home.ne.jp> さんは書きました:
> > Mizと申します。
> >
> > PDO+Oracle9iでプレイスホルダに変数をバインドできません。どなたかアドバ
> > イスをお願いします。
> _______________________________________________
> PHP-users mailing list  PHP-users @ php.gr.jp
> http://ml.php.gr.jp/mailman/listinfo/php-users
> PHP初心者のためのページ - 質問する前にはこちらをお読みください
> http://www.php.gr.jp/php/novice.php3




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