2011-07-26 28 views
0

当我运行下面的代码来更新行:无法使用PDO

// Loop through each store and update shopping mall ID 

    protected function associateShmallToStore($stores, $shmall_id) { 

    foreach($stores as $store_id) { 
     $sql .= 'UPDATE my_table SET fk_shmallID = :shmall_id WHERE id = :store_id'; 
     $stmt = $this->db->prepare($sql); 
     $stmt->bindParam(':shmall_id', $shmall_id); 
     $stmt->bindParam(':store_id', $store_id); 
     $stmt->execute(); 
    } 

    } 

我得到以下信息:
​​

我也尝试没有成功以下(不含$stmt->bindParam) :
$stmt->execute(array($shmall_id, $store_id));

我不明白我在做什么错。

UPDATE 我已更新我的代码以反映我在源代码中实际得到的内容。这里不应该有任何错别字。

更新2
我尝试这样做,但我仍然得到同样的错误消息。

protected function associateShmallToStore($stores, $shmall_id) { 
    $i = 0; 

    $sql .= "UPDATE sl_store "; 

    foreach($stores as $store_id) { 
     $i++; 
     $sql .= 'SET fk_shmallID = :shmall_id, lastUpdated = NOW() WHERE id = :store_id_'.$i.','; 
    } 

    $sql = removeLastChar($sql); 
    $stmt = $this->db->prepare($sql); 

    $stmt->bindParam(':shmall_id_'.$i, $shmall_id); 

    $i = 0; 
    foreach($stores as $store_id) { 
     $i++;  
     $stmt->bindParam(':store_id_'.$i, $store_id); 
    } 

    $stmt->execute(); 
    } 

这是SQL查询的输出:

UPDATE sl_store 
    SET fk_shmallID = :shmall_id, lastUpdated = NOW() WHERE id = :store_id_1, 
    SET fk_shmallID = :shmall_id, lastUpdated = NOW() WHERE id = :store_id_2 

更新3
我endet了使用的代码是这样的:

foreach($stores as $store_id) { 
     $sql = "UPDATE sl_store SET fk_shmallID = :shmall_id WHERE id = :store_id"; 
     $stmt = $this->db->prepare($sql); 
     $stmt->bindParam(':shmall_id', $shmall_id); 
     $stmt->bindParam(':store_id', $store_id); 
     $res = $stmt->execute(); 
    } 
+0

为什么在SQL UPDATE查询中两次写入SET?请参阅:http://dev.mysql.com/doc/refman/5.0/en/update.html – Dor

+1

@Steven,这是一个无效的SQL查询。你之前拥有的是正确的。只需为每行运行一个更新并删除拼接运算符。 – rid

+0

@Radu - 是的,我现在正在工作:) – Steven

回答

4

这只是作为错误说,你有混合的名字和位置参数:

  • :name(命名)
  • :person_id(命名)
  • ?(位置)比

更多,你有指定的参数:person_id,但你结合:id

这些都是您的参数,我会打电话给他们P1P2P3

UPDATE my_table SET name = :name WHERE id = :person_id ? 
         ^P1   ^P2  ^P3 

而这正是你将它们绑定:

$stmt->bindParam(':name', $name); // bound to P1 (:name) 
    $stmt->bindParam(':id', $person_id); // bound to nothing (no such param :id) 

你可能想第二个参数绑定到:person_id,而不是:id,并删除最后一个位置参数(查询结尾处的问号)。

而且,通过foreach循环每次迭代追加更多的查询,因为你使用的不是赋值运算符连接运算符:

$sql .= 'UPDATE my_table SET name = :name WHERE id = :person_id ?'; 

你可能想要删除.之前=

有关详细信息,请参阅PDO手册中的Prepared statements and stored procedures页面。您将了解如何绑定参数以及命名参数和位置参数之间的区别。

所以,总结一下:

  1. 替换为SQL行:

    $sql = 'UPDATE my_table SET name = :name WHERE id = :person_id'; 
    
  2. 更换第二bindParam()通话用:

    $stmt->bindParam(':person_id', $person_id); 
    
+0

除此之外,我看到一个'$ sql。=',在第一个循环后使查询无效。 – Wrikken

+0

@Wrikken,谢谢,更新了答案。 – rid

+1

也许补充说,在foreach中重复编写相同的语句并不是准备好的语句。人们可以简单地在循环之外准备它,只需:'$ stmt-> execute(array(....));'循环内部。 – Yoshi

0

尝试:

$sql = 'UPDATE my_table SET name = :name WHERE id = :id'; 
+0

这是一种类型,对不起。现在更新代码。 – Steven

+0

@Steven:在赋值运算符之前删除'.',就像我以前所建议的那样。将'$ sql。='更改为'$ sql =' – Shef