2013-03-12 116 views
2

我被困在这一个,最近转向PDO学习我自己。PDO SQLSTATE [HY093]:无效的参数编号

/** 
* 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对象::执行()[pdostatement.execute]:SQLSTATE [HY093]:无效参数数:参数没有在

定义如何正确绑定整数值我通过在与函数一起,以便可以执行该语句?

回答

0

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

顺便说一句,使用不是石器时代的库,例如PDO的时候,但something more useful,你将不再需要任何的update()函数所有的,因为你可以简单的写

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

请注意后者的代码比你更安全,但方式更加灵活:

  • 它保护的表名
  • 它保护字段名
  • 它可以让你不仅基于id的WHERE,而且是任何条件。
  • 它可以让你无论语法(甚至连接)其实
+0

你推荐哪些库不要有太高的学习曲线? – egilviking 2013-03-12 13:02:12

+0

我链接到 - SafeMysql。在我看来,它根本就没有学习曲线 - 只需编写通常的SQL,用占位符代替动态部分,并在一次函数调用中获得结果。 – 2013-03-12 13:23:00

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

你需要把关键的名称作为占位符这里,而不是价值。

+0

最后一个','? – MatRt 2013-03-12 12:50:17

+0

怎么样?之后修剪。实际上,一个“implode”调用总体上会更好,但这与问题无关。 – deceze 2013-03-12 12:51:00

+0

这段代码很容易出现SQL注入。 – 2013-03-12 13:01:57

相关问题