PDO SQLSTATE [HY093]:参数号无效

时间:2013-03-12 12:41:51

标签: php pdo bind statements

我坚持这个,最近切换到PDO学习自己。

/**
* update
* @param string $table A name of a table to update into
* @param string $data An associative array.
* @param string $where WHERE = ?.
*/
public function update($table, $dataArr, $where)
{
    $fieldDetails = NULL;

    foreach( $dataArr as $key => $value)
    {
        $fieldDetails .= "`$key` =:$value, ";
    }
    $fieldDetails = rtrim($fieldDetails,', ');

    echo "UPDATE $table SET ($fieldDetails) WHERE (`id`=:$where)";


    $stmt = $this->prepare("UPDATE $table SET ($fieldDetails) WHERE (`id`=:$where)");
    foreach($dataArr as $key => $value) 
    {
        //Binder key till värde.
        $stmt->bindValue(":$key", $value);
    }
    $stmt->bindValue(":$where", $where);
    $stmt->execute();

}

我的插入功能就像一个魅力,但这个更新功能不起作用。我认为它与id没有绑定有关。我在文档和线程中搜索过但找不到解决方案。

我的函数调用。

public function update()
{
    $this->db->update(
    'testtable',
    array(
    'text' => 'exempel',
    'name' => 'exempel',
    ), 0);
}

警告:PDOStatement :: execute()[pdostatement.execute]:SQLSTATE [HY093]:参数号无效:

中未定义参数

如何正确地将我传入的整数值与函数绑定,以便可以执行语句?。

2 个答案:

答案 0 :(得分:0)

编辑:
好吧,我忽略了代码,道歉 无论如何,您的代码对SQL注入是开放的,最好使用PDO tag wiki中的解决方案。

顺便说一句,当不使用像PDO这样的石器时代的库而是使用something more useful时,你根本就不需要update()函数,因为你可以简单地写一下

$db->query("UPDATE ?n SET ?u WHERE id=?i",$table, $dataArr, $id);

请注意,后一个代码比您的更安全,但更灵活:

  • 确实保护了表名
  • 确实保护了字段名称
  • 它不仅可以让您使用基于id的WHERE,还可以使用任何条件。
  • 它可以让你实现任何语法(甚至是JOIN)

答案 1 :(得分:0)

$fieldDetails .= "`$key` =:$key, ";

您需要在此处将键名称作为占位符,而不是值。