2012-11-01 58 views
1

在我的數據庫中,我有類似「狀態」的字段,它們是保留的關鍵字。此代碼工作正常,我(狀態``轉義):PHP PDO:如何處理bindValue()和保留關鍵字?

$sql = "UPDATE $table SET `status`='$status' WHERE `id`='123'"; 

但現在我想只用準備好的發言!我Database.class:

class Database extends \PDO { 
    private $_sth; // statement 
    private $_sql; 

    public function update($tbl, $data, $where, $where_params = array()) { 
     // prepare update string and query 
     $update_str = $this->_prepare_update_string($data); 
     $this->_sql = "UPDATE $tbl SET $update_str WHERE $where"; 
     $this->_sth = $this->prepare($this->_sql); 

     // bind values to update 
     foreach ($data as $k => $v) { 
      $this->_sth->bindValue(":{$k}", $v); 
     } 

     // bind values for the where-clause 
     foreach ($where_params as $k => $v) { 
      $this->_sth->bindValue(":{$k}", $v); 
     } 

     return $this->_sth->execute(); 
    } 

    private function _prepare_update_string($data) { 
     $fields = ""; 
     foreach ($data as $k => $v) { 
      $fields .= "`$k`=:{$k}, "; 
     } 
     return rtrim($fields, ", "); 
    } 
} 

更新的例子,將無法正常工作:

$DB = new Database(); 
$DB->update("tablename", 
     array("status" => "active"), 
     "`username`=:username AND `status`=:status", 
     array("username" => "foofoo", "status" => "waiting")); 

我認爲,這是因爲被保留的關鍵字的 「狀態」。但我不知道如何逃避它。我試圖將_prepare_update_string($ data)中的佔位符轉義爲:

bindValue("`:{$k}`", $v) 

但沒有結果。

我希望這個解決方案非常簡單,它只是在我的大腦中出現了一個卡住的溢出。 ;-)提前致謝的人!

回答

3

當你構建,以及在兩種情況你將數據綁定的foreach循環的SQL字符串(prepare_update_string我認爲),運行遞增計數並將其追加到綁定值。所以「:status」變成「:status1」。

喜歡的東西:

$i = 1; 
foreach ($data as $k => $v) { 
    $this->_sth->bindValue(":{$k.$i}", $v); 
    $i++; 
} 

這將解決任何保留關鍵字的問題。

它還解決了,你需要綁定到相同的佔位符不止一次的問題(我敢肯定你會在未來遭遇)。

例如不要使用以下,這將引發錯誤的是由於兩個結合:狀態佔位

SELECT * from table WHERE `status` = :status AND `otherfield` = :status 

和遞增計數,這將成爲:

SELECT * from table WHERE `status` = :status1 AND `otherfield` = :status2 

享受。

+1

這解決了這個問題。該OP是使用':status'佔位符在多個地方 – Phil

+1

+1作爲很好的解決方案,但我編輯爲你的最後兩個例子已領域束縛,不是值。如上所述,Alex不能綁定字段名稱(或表名),因爲它們用於預優化查詢。 – Robbie

+0

@Jonathan:感謝這個簡單的解決方案。我只是添加了迭代器,它對我來說工作正常。對我感到羞恥! :) –