当我尝试更新我的值时,它给出了以下错误: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'。
如果有人知道这方面的解决方案,那么我会非常高兴,提前谢谢。
答案 0 :(得分:0)
你正在参数化部分,这很好,但你可能应该完全参数化 。为了更清晰地演示,我们假设我们在将update(array("occupation" => "poet"), "name", "Horace")
设置为$this->table
时调用"persons"
。然后我们将编写这个SQL:
UPDATE persons SET occupation = :occupation WHERE name = : Horace
然后我们用这些参数值执行它:
occupation => poet
:Horace => Horace
occupation = :occupation
部分非常好且正确;但是name = : Horace
和:Horace => Horace
是错误的。你可能应该组成这样的查询:
UPDATE persons SET occupation = :occupation WHERE name = :name
这些参数值:
occupation => poet
name => Horace
但是,如果您遇到过像update(array("occupation" => "unemployed"), "occupation", "poet")
这样的情况,那么您可能会遇到一些问题,因为您需要为occupation
设置两个不同的参数(一个旧的,一个新的),你将同时调用occupation
。一个人胜过另一个,你的UPDATE
什么都不做。所以你必须处理这个案子,否则,它应该是相当简单的。