在我的数据库中,我有像"status"这样的字段,它们是保留关键字。这段代码对我来说很好(状态由``转义):
$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"));
我认为,这是因为 reserverd 关键字“状态”。但我不知道如何逃脱它。我试图将 _prepare_update_string($data) 中的占位符转义为:
bindValue("`:{$k}`", $v)
但没有结果。
我希望解决方案非常简单,它只是我大脑中的一个卡住溢出。;-) 提前感谢人们!