pdo中的特殊字符

时间:2014-11-02 19:42:35

标签: php pdo special-characters

当我尝试更新我的值时,它给出了以下错误: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'。

如果有人知道这方面的解决方案,那么我会非常高兴,提前谢谢。

1 个答案:

答案 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什么都不做。所以你必须处理这个案子,否则,它应该是相当简单的。