当我尝试更新我的值时,它会给我以下错误:SQLSTATE[HY093]:无效的参数编号:未定义参数。这只出现在特殊字符中,例如:(hello;)而不出现在(hello)中由于某些原因,它找不到具有特殊字符的值,我只能插入它们而不是从我的数据库中更新或删除它。
并且数据库已经设置在utf8上。
public function update($data, $key, $value) {
try {
$this->query = 'UPDATE ' . $this->table . ' SET ';
array_walk($data, function($index, $key) {
$this->query .= $key . ' = ' . ':' . $key . ', ';
});
$this->query = rtrim($this->query, " ,");
$this->query .= " WHERE $key = :$value";
$stmt = $this->db->prepare($this->query);
$stmt->execute(array_merge($data, array($value => $value)));
return true;
} catch(PDOException $e) {
echo $e->getMessage();
}
}
我如何使用它的一个例子:
if(isset($oldValue, $newValue)) {
$data['database']->update(array("name" => $newValue), "name", $oldValue);
}
数组将提供一个键和一个要更新的新值,逗号之后将搜索表"name"中的值。
如果有人知道解决这个问题的办法,我会非常高兴,提前谢谢。
您正在部分地参数化,这很好,但您可能应该完全地参数化。为了更清楚地演示,让我们假设调用update(array("occupation" => "poet"), "name", "Horace")
时$this->table
设置为"persons"
。然后我们将编写这个SQL:
UPDATE persons SET occupation = :occupation WHERE name = : Horace
然后我们用这些参数值执行它:
occupation => poet
:Horace => Horace
occupation = :occupation
部分是优秀的和正确的;但CCD_ 5和CCD_。相反,您可能应该编写这样的查询:
UPDATE persons SET occupation = :occupation WHERE name = :name
这些参数值:
occupation => poet
name => Horace
然而,如果您曾经遇到过像update(array("occupation" => "unemployed"), "occupation", "poet")
那样调用它的情况,您可能会遇到一些问题,因为您需要为occupation
提供两个不同的参数(一个旧参数,一个新参数),并且您将同时调用两个occupation
。一个会战胜另一个,而你的UPDATE
什么都不会做。所以你必须处理这种情况,但除此之外,它应该相当简单。