2013年8月11日 星期日

PDO - 執行 bindParam 的問題

下面這段得到的結果是錯的:
$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的一个陷阱

沒有留言:

張貼留言