PDO SQLSTATE [HY093]:无效的参数编号
问题描述:
我被困在这一个,最近转向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]:无效参数数:参数没有在
定义如何正确绑定整数值我通过在与函数一起,以便可以执行该语句?
答
编辑:
那么,我忽视了代码,我的道歉。
无论如何,你的代码对SQL注入是开放的,最好使用PDO tag wiki的解决方案。
顺便说一句,使用不是石器时代的库,例如PDO的时候,但something more useful,你将不再需要任何的update()函数所有的,因为你可以简单的写
$db->query("UPDATE ?n SET ?u WHERE id=?i",$table, $dataArr, $id);
请注意后者的代码比你更安全,但方式更加灵活:
- 它保护的表名
- 它保护字段名
- 它可以让你不仅基于id的WHERE,而且是任何条件。
- 它可以让你无论语法(甚至连接)其实
你推荐哪些库不要有太高的学习曲线? – egilviking 2013-03-12 13:02:12
我链接到 - SafeMysql。在我看来,它根本就没有学习曲线 - 只需编写通常的SQL,用占位符代替动态部分,并在一次函数调用中获得结果。 – 2013-03-12 13:23:00