如何调试SQLSTATE [HY000]:一般错误:2031在预准备语句中

时间:2016-06-13 12:55:33

标签: php pdo prepared-statement bindparam

我有这个准备好的陈述查询

$stmt = $conn->prepare("
        UPDATE language 
        SET lang_alias=:lang_alias , lang_name=:lang_name  
        WHERE lang_id=:lang_id"
);

如果我设置数组来绑定值

$query_array = array ( ":lang_alias" => "en", ":lang_name" => "English (UK)", ":lang_id" => 1 ) ;

然后执行它

$stmt->execute(array($query_array));

它不会工作,我得到

  

注意:数组转换为字符串referring to $ stmt-> execute(array($ query_array));

Uncaught exception 'PDOException' with message 'SQLSTATE[HY093]: Invalid parameter number'指的是同一行。

然后我尝试使用 bindParam绑定值

$stmt->bindParam(':lang_alias', $a);
$stmt->bindParam(':lang_name', $c);
$stmt->bindParam(':lang_id', $d3, PDO::PARAM_INT);

并且工作正常

如果我尝试替代bindParam语法

$stmt->bindParam("sssiii", $a, $b, $c, $d1, $d2, $d3);

它不会工作。给出

  

警告:PDOStatement :: bindParam()最多需要5个参数,7个给定referring to $ stmt-> bindParam(“sssiii”,$ a,$ b,$ c,$ d1,$ d2, $ D3);

  

带有消息'SQLSTATE [HY000]的未捕获异常'PDOException':常规错误:2031'referring to $ stmt-> execute();

1。错误是由默认情况下预处理语句转换为字符串所有值引起的,所以我必须手动定义int?这就是为什么bindParam工作得很好?或者是我缺少的其他东西?

2. 为什么bindParam("sssiii"... sytntax不起作用?

3。我希望此查询动态获取其值,因此手动使用bindParam不是一种选择。我想使用关联数组或bindParam("sssiii"...语法。

我该怎么做?感谢

1 个答案:

答案 0 :(得分:3)

$query_array已经是一个数组,因此当您运行$stmt->execute(array($query_array))时,您将进入一个多维数组。这样:

$stmt->execute($query_array);

应该就是您所需要的一切。

关于bind问题,您没有使用PDO语法

您在mysqli使用sssiii语法。