2

我坚持这个,最近切换到 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]: Invalid parameter number: parameter was not defined in

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

4

2 回答 2

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

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

于 2013-03-12T12:49:38.033 回答
0

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

顺便说一句,当使用的不是像 PDO 这样的石器时代库,而是更有用的东西时,您根本不需要 update() 函数,因为您可以简单地编写

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

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

  • 它确实保护表名
  • 它确实保护了字段名称
  • 它不仅可以让您基于 id 的 WHERE,还可以让您在任何条件下。
  • 它实际上允许您使用任何语法(甚至是 JOIN)
于 2013-03-12T12:44:46.820 回答