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)
但沒有結果。
我希望這個解決方案非常簡單,它只是在我的大腦中出現了一個卡住的溢出。 ;-)提前致謝的人!
這解決了這個問題。該OP是使用':status'佔位符在多個地方 – Phil
+1作爲很好的解決方案,但我編輯爲你的最後兩個例子已領域束縛,不是值。如上所述,Alex不能綁定字段名稱(或表名),因爲它們用於預優化查詢。 – Robbie
@Jonathan:感謝這個簡單的解決方案。我只是添加了迭代器,它對我來說工作正常。對我感到羞恥! :) –