Php 如何调试SQLSTATE[HY000]:常规错误:已准备语句中的2031

Php 如何调试SQLSTATE[HY000]:常规错误:已准备语句中的2031,php,pdo,prepared-statement,bindparam,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" => "Engl

我已经准备好了这个查询语句

$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));
我明白了,这行不通

注意:数组到字符串的转换
指的是
$stmt->execute(数组($query\u数组))

未捕获异常'PDOException',消息'SQLSTATE[HY093]:无效参数号'
引用同一行

然后我尝试使用
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个参数是给定的
引用的
$stmt->bindParam(“sssiii”、$a、$b、$c、$d1、$d2、$d3)

未捕获异常“PDOException”,消息为“SQLSTATE[HY000]:一般错误:2031”
参考
$stmt->execute()

1。错误是由以下事实引起的:默认情况下,准备好的语句将所有值转换为字符串,因此我必须手动定义
int
?这就是为什么
bindParam
工作正常的原因?还是我遗漏了什么

2.为什么
bindParam(“sssiii”…
sytntax不能工作

3.我希望此查询动态获取其值,因此手动使用
bindParam
不是一个选项。我希望使用关联数组或
bindParam(“sssiii”…
语法


我该怎么做呢?谢谢这个
$query\u数组已经是一个数组了,所以当你运行
$stmt->execute(array($query\u array))
时,你就变成了一个多维数组。这是:

$stmt->execute($query_array);
这应该是你所需要的

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

您正在对
sssiii
使用
mysqli
语法


$query\u数组
已经是一个数组,因此当您运行
$stmt->execute(数组($query\u数组))
时,您将创建一个多维数组。这:

$stmt->execute($query_array);
这应该是你所需要的

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

您正在对
sssiii
使用
mysqli
语法


@Fred ii-完成。仍然是相同的错误。这是SO中的一个输入错误,而不是我的代码中的一个输入错误。@slevin如果Chris的评论解决了问题,也许可以邀请他将其作为答案发布,然后其他人从他脚下拉开地毯;-)@chris85是的,就是它,谢谢你指出它。
bindParam(“sssiii”)的问题…
语法仍然存在。我看不出有什么问题。
sssiii
是mysqli_uuuu语法,而不是PDO。@Fred ii-谢谢编辑。@Fred ii-完成。仍然是相同的错误。那是SO中的一个输入错误,不是我的代码。@slevin如果Chris的评论解决了这个问题,也许可以邀请他作为答案发布,然后其他人从他脚下拉开地毯;-)@chris85是的,就是这样,谢谢你指出。
bindParam(“sssiii”)语法的问题仍然存在。我看不出有什么问题。
sssiii
是mysqli_uuu语法,而不是PDO。@Fred ii-谢谢你的编辑。最后一件事。所以,准备好的语句没有
bindParam($a,$b,$c)
语法?据我所知,不,不是在PDO中。在PDO中,
bindParam
期望绑定一个参数。最后一件事。因此,准备好的语句没有
bindParam($a,$b,$c)
语法?据我所知,不,不是在PDO中。在PDO中,
bindParam
需要绑定一个参数。