2014-11-02 39 views
0

当我尝试更新我的值时,它给了我以下错误:SQLSTATE [HY093]:无效的参数编号:参数未定义。 这只发生在特殊字符上,例如:(hello;)而不是(hello) 由于某些原因,它无法找到包含特殊字符的值,我只能插入它们 而不是将其从数据库中更新或删除。pdo中的特殊字符

而数据库已经设置在utf8上。

public function update($data, $key, $value) { 
    try { 

     $this->query = 'UPDATE ' . $this->table . ' SET '; 

     array_walk($data, function($index, $key) { 
      $this->query .= $key . ' = ' . ':' . $key . ', '; 
     }); 

     $this->query = rtrim($this->query, " ,"); 

     $this->query .= " WHERE $key = :$value"; 

     $stmt = $this->db->prepare($this->query); 

     $stmt->execute(array_merge($data, array($value => $value))); 

     return true; 

    } catch(PDOException $e) { 
     echo $e->getMessage(); 
    } 
} 

一个例子,我如何使用它:

if(isset($oldValue, $newValue)) { 
$data['database']->update(array("name" => $newValue), "name", $oldValue); 
} 

数组是给一个键和一个新的值更新和逗号后是搜索表中的“名称”的价值。

如果有人知道这个解决方案,那么我会很高兴,在此先感谢。

+0

你可以举一个例子说明你如何调用'update'? – icktoofay 2014-11-02 19:48:32

+0

您需要从':$ value'中删除'$'标志 - 另外,很难说,但如果您碰巧使用的是单词'key', - 'key'是MySQL保留字; * – 2014-11-02 19:50:27

+0

@icktoofay查看上面的帖子我编辑了它 – user3139504 2014-11-02 19:50:37

回答

0

你参数化部分,这很好,但你应该参数化完全。为了更清楚地展示,让我们假设我们呼叫update(array("occupation" => "poet"), "name", "Horace")并将$this->table设置为"persons"。然后我们会组成这个SQL:

UPDATE persons SET occupation = :occupation WHERE name = : Horace 

我们会再与这些参数值执行:

occupation => poet 
:Horace => Horace 

occupation = :occupation部分是优秀的和正确的;但是name = : Horace:Horace => Horace是错误的。你反而可能应该构成这样的查询:

UPDATE persons SET occupation = :occupation WHERE name = :name 

而且这些参数值:

occupation => poet 
name => Horace 

如果你有,你这样称呼它update(array("occupation" => "unemployed"), "occupation", "poet")的情况下,然而,你可能有一些问题,因为您需要为occupation(一个老的,一个新的)有两个不同的参数,并且您将拨打occupation。一个会胜过另一个,你的UPDATE什么都不会做。所以你必须处理这种情况,否则,它应该相当简单。