2014-02-21 69 views
-1

這讓我非常瘋狂,我已經重寫過幾次,但仍然沒有結束。我的插入功能工作得很好。我不知道我忽略了什麼,任何你可能會建議可能會有所幫助的東西都會非常感激。PHP MySQL PDO更新不起作用

function update($table, $data, $idName='id') 
    { 
     if(empty($data) || !is_array($data)) 
      return false; 

     $columns = $values = array(); 
     foreach($data as $key => $val) 
      $columns[] = "$key=:$key"; 
     $columns = makeCSL($columns, false); 

     try { 
      $qStr = "UPDATE $table SET $columns WHERE $idName=:id"; 
      echo $qStr; 
      $query = $this->dbHandle->prepare($qStr); 
      foreach($data as $key => $val) 
       $query->bindParam("':$key'", $val, PDO::PARAM_STR); 
      $query->execute(); 
     } catch(PDOException $e) { 
      $this->errCode = $e->getCode(); 
      $this->errInfo = $e->errorInfo[2]; 
     } 
    } 
+1

什麼是'makeCSL'功能做的工作? –

+1

這裏缺少的是對問題的簡要描述。 '不工作'只是沒有傳達任何東西。你有錯誤信息嗎?你有沒有檢查你的服務器錯誤日誌? – 2014-02-21 03:34:56

+0

@scrowler推測它代表逗號分隔列表,所以它只是做一些像'implode(',',$ columns)'。 – Barmar

回答

-1

得到它用下面的代碼

function update($table, $data, $idName="id") 
    { 
     if(empty($data) || !is_array($data)) 
      return false; 

     $columns = array(); 
     foreach($data as $key => $val) 
      $columns[] = "$key=:$key"; 
     $columns = makeCSL($columns, false); 

     try { 
      $query = $this->dbHandle->prepare("UPDATE $table SET $columns WHERE $idName=:id"); 
      $query->execute($data); 
     } catch(PDOException $e) { 
      $this->errCode = $e->getCode(); 
      $this->errInfo = $e->errorInfo[2]; 
     } 
    } 
+0

你能解釋一下你改變了什麼嗎 – Barmar

+0

而不是使用bindParam或bindValue我把它設置爲簡單的使用鍵,代碼根據數組值創建一個鍵列表,並通過SQL查詢傳遞這些鍵,包括ID鍵 – Nathan

+0

你仍然有兩種':id'佔位符的用法,我很驚訝它的工作 – Barmar

1

你有幾個問題。

首先,你不應該把引號放在綁定佔位符的周圍。其次,您需要使用bindValue,因爲bindParam綁定到引用,因此所有內容都將從上一次通過循環綁定到$val的值。第三,你沒有綁定:id

所以它應該是:

foreach($data as $key => $val) { 
    if ($key != 'id') { 
     $columns[] = "$key=:$key"; 
    } 
} 

... 

foreach ($data as $key => $val) { 
    $query->bindValue(":$key", $val, PDO::PARAM_STR); 
} 
+0

id變量位於數據數組中。我嘗試切換到bindValue,但仍然沒有去。沒有錯誤被拋出或任何東西,它只是不更新​​數據庫。 ( – Nathan

+0

)在這種情況下,您的查詢中有兩個':id'佔位符,一個在'SET'子句中,另一個在'WHERE'子句中,不允許使用重複的佔位符。在創建'SET'子句時跳過該字段 – Barmar

+0

我也設置了它,但它仍然無法正常工作我提交了一個完全適合我的答案 – Nathan