プロが教えるわが家の防犯対策術!

いつもお世話になっております。
PHP5.2.5
---------------------------
DB(フィールドは以下3項目)
・id(primary key)
・color
・num
---------------------------

//DBにインサートするデータ群(配列に格納してある)
$insert_array = array('color'=>'red','num'=>6);

//==================================================
// *フィールド名とそれに対応するデータをバインドする。
//==================================================

//==================================================
// *バインド:方法1
//==================================================

foreach($insert_array as $field => $value){

 //確認処理
 //echo $field.'<br/>';
 //echo $value.'<br/>';

 //バインド(foreachで、1つずつバインドしていく)
 $stmt->bindParam(':'.$field,$value);

}

//==================================================
// *バインド:方法2(↓こちらだと上手くいく。)
//==================================================

/*
$stmt->bindParam(':'.'color',$insert_array['color']);
$stmt->bindParam(':'.'num',$insert_array['num']);
*/


//==================================================
// *バインド後、「$stmt->execute();」した結果
// *DBにインサートされたものをprint_r()にて確認
//==================================================

★方法1

Array
(
[id] => 15
[color] => 6
[num] => 6
)

//---------------------------
★方法2

Array
(
[id] => 16
[color] => red
[num] => 6
)

//---------------------------

★方法1の結果の、「 [color] => 6」って一体…?!

方法2のように、同じバインド処理を手書きで繰り返す分にはうまくいくのですが、
方法1のようなforeachでまとめて処理するやり方だとうまくいきません。
方法1の問題箇所をどなたか教えて下さい。
宜しくお願い致します。

A 回答 (1件)

bindParamでバインドされるのは変数の値ではなく変数です。

また、マニュアルから引用すると
「変数は参照としてバインドされ、PDOStatement::execute() がコールされたときのみ評価されます。」
なので、foreach内での
>$stmt->bindParam(':'.$field,$value);
は、言ってみれば$valueの位置を記憶しているにすぎません。
で、execute実行時に初めて中身の値を取りに行き、そこに入っているもの(要するにforeachの最後の値)をセットしてしまっています。

参考URL:http://www.php.net/manual/ja/pdostatement.bindpa …
    • good
    • 0
この回答へのお礼

早速どうもありがとうございます。

>bindParamでバインドされるのは変数の値ではなく変数

すぱっと理解できました。
では、いざ挑戦してきます!
うまく動くことが確認できましたら、回答を締め切らせて頂きます!

お礼日時:2009/10/11 00:32

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!