$arr = array('cust_id'=>'ID001', 'cust_name'=>'Peter'); $sql = "INSERT INTO test_table (cust_id, cust_name) VALUES(:cust_id, :cust_name)"; $result = $db->prepare($sql); foreach($arras $key => $value){ $result->bindParam(':'.$key, $value); } $result->execute();
執行後發現 id 跟 name 一樣,都是 Peter。因為 bindParam 是傳址,當迴圈跑完, 這時候的 $value 是 Peter 。然後去執行 execute(),就會變成
:cust_id => 'Peter'
:cust_name => 'Peter'
遇到這種情形,要改用 bindValue。
另一種變通的做法:
$$key= $row[$key]; $result->bindParam(':'.$key, $$key);這裡用了 2 個 $ 來設定內容。第一次迴圈 $key 等於 cust_id,然後再透過 $$key,得到 $cust_id 這個新變數。第二次迴圈得到 $cust_name 。
參考:PDOStatement::bindParam的一个陷阱
沒有留言:
張貼留言