How to debug SQLSTATE[HY000]: General error: 2031 in prepared statements

How to debug SQLSTATE[HY000]: General error: 2031 in prepared statements

我有这个准备好的语句查询

$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));

它不会工作,我得到

Notice: Array to string conversionreferring 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);

它不会工作。给予

Warning: PDOStatement::bindParam() expects at most 5 parameters, 7 givenreferring to$stmt->bindParam("sssiii", $a, $b, $c, $d1, $d2, $d3);

Uncaught exception 'PDOException' with message 'SQLSTATE[HY000]: General error: 2031 'referring to$stmt->execute();

1. 是不是因为prepared statements默认把所有的值都转成string,所以要自己手动定义int?这就是 bindParam 工作正常的原因?还是我还缺少其他东西?

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

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

我该怎么做?谢谢

$query_array 已经是一个数组,所以当您 运行 $stmt->execute(array($query_array)) 时,您正在制作一个多维数组。这个:

$stmt->execute($query_array);

应有尽有。

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

您正在使用 mysqli 语法和 sssiii