私のデータベースには、予約済みのキーワードである「status」のようなフィールドがあります。このコードは私にとってはうまく機能します(ステータスは``によってエスケープされます):
$sql = "UPDATE $table SET `status`='$status' WHERE `id`='123'";
しかし、今はプリペアドステートメントのみを使用したいです!My 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"));
それは、reservedキーワード「status」のせいだと思います。しかし、私はそれを逃れる方法がわかりません。_prepare_update_string($ data)のプレースホルダーを次のようにエスケープしようとしました:
bindValue("`:{$k}`", $v)
しかし、結果はありません。
私は解決策が非常に単純であり、それが私の脳の中で行き詰まったオーバーフローであることを願っています。;-)よろしくお願いします!