2013-04-15 79 views
0

PHP PDO顯示一些莫名其妙的行爲。參數佔位符被替換爲相同的值。PHP PDO佔位符被替換爲相同的值

$查詢

UPDATE `newsletters` SET `title` = :title , `scheduled` = :scheduled , `modified` = :modified WHERE `id` = :id 

$參數

Array 
(
    [:title] => New Newsletter22 
    [:scheduled] => 2013-04-15 21:47:00 
    [:modified] => 2013-04-15 21:47:51 
    [:id] => 35 
) 

的功能

public static function execute($query=null,$parameters=array()) 
{ 
    global $dbnew; 

    $statement= $dbnew->prepare($query); 


     foreach($parameters as $k=>$v){ 
      if(is_array($v)){ 
       $statement->bindParam($k, $v[0],$v[1]); 
      }else{ 
       $statement->bindParam($k, $v); 
      } 
     } 


    $statement->execute(); 
    return $statement; 
} 

執行的查詢

1132 Query UPDATE `newsletters` SET `title` = '35' , `scheduled` = '35' , `modified` = '35' WHERE `id` = '35' 
+7

您可能想使用'bindValue'而不是'bindParam'。您的foreach循環會在每次迭代時覆蓋$ v的值。更多信息在這裏:http://stackoverflow.com/questions/1179874/pdo-bindparam-versus-bindvalue – showdev

+0

是的,或將值推入數組。 – Jonast92

+1

每當在我的PHP代碼中看起來對我來說難以理解時,我或多或少會自動轉到手冊中的函數/方法頁面,並仔細檢查所有參數,返回類型,註釋,警告和用戶註釋。大多數情況下,這是一個簡短的A-HA!然後回到編碼。 –

回答

2

方法bindParam將引用綁定到變量,而不是變量的值。

您的foreach循環在每次迭代時更新$v的值。

由於bindParam在實際執行查詢之前不綁定值,因此示例中所有綁定參數的值將相同。它們將被綁定到您上一次循環迭代的值$v

使用bindValue來綁定變量的實際值而不是引用。

$statement->bindValue($k, $v);

php.net documentation

布爾PDOStatement對象:: bindParam
綁定一個PHP變量到對應的命名或問號佔位符 在SQL語句中用於製備聲明。與 PDOStatement :: bindValue()不同,變量被綁定爲引用,並且 僅在調用PDOStatement :: execute()時被計算。