2014-11-02 116 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什麼都不會做。所以你必須處理這種情況,否則,它應該相當簡單。