pdo中的特殊字符



当我尝试更新我的值时,它会给我以下错误: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什么都不会做。所以你必须处理这种情况,但除此之外,它应该相当简单。

最新更新