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
。
我有这个准备好的语句查询
$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 conversion
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);
它不会工作。给予
Warning: PDOStatement::bindParam() expects at most 5 parameters, 7 given
referring 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
。