【问题标题】:mysqli_stmt::bind_param Number of variables doesn't match number of parameters in prepared statementmysqli_stmt::bind_param 变量数与准备好的语句中的参数数不匹配
【发布时间】:2023-03-27 05:05:01
【问题描述】:

这是我创建准备好的语句的函数:

function query($query, $values_array) {

if ($stmt = $link->prepare($query)) {

    for ($i = 1; $i < count($values_array); $i++) {
     if (!$stmt->bind_param($values_array[0][$i-1], $values_array[$i])) {
        return false;
     }
    }

if (!$stmt->execute()) {
    return false;
}
$result = $stmt->get_result();
$stmt->close();
}

return $result;
}

$查询是

insert into table (var1, var2, var3, var4, var5, var6) values (?, ?, ?, ?, ?, ?)

$values_array 是

array(7) {
[0]=>
string(6) "diisii"
[1]=>
float(9)
[2]=>
int(1)
[3]=>
int(1)
[4]=>
string(5) "now()"
[5]=>
int(1)
[6]=>
int(1)
}  

我无法找出问题所在,因为仅在将参数绑定到插入语句时才会引发此错误。选择语句没有问题!

【问题讨论】:

  • now() 不起作用,因为它是作为文字字符串传递的。您可以尝试使用替代 -&gt;bind_param 签名,将类型字符串与所有参数一起传递,call_user_func_array(array($stmt, "bind_param"), $values_array)
  • 离开 now() 时出现同样的错误。是的,我知道 call_user_func_array 函数,但是我需要重组我不想做的 $values_array。

标签: php mysqli


【解决方案1】:

这是一个清楚的例子,说明了为什么 mysqli 完全不能用于准备好的语句。
使用 PDO 或手动解析自定义占位符,例如 safemysql

与 mysqli 不同,PDO 有 2 个优点可以使准备好的语句可用:

  • 绑定占位符,方法是使用bindValue() 或将数组传递给execute()
  • 普通数组的形式返回查询结果,而不是单独变量的奇怪绑定。

【讨论】:

  • 刚刚测试过 PDO,它可以正常工作。多么奇怪的问题……+1
猜你喜欢
  • 2016-01-23
  • 1970-01-01
  • 2016-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-30
  • 2016-10-08
  • 2015-05-17
相关资源
最近更新 更多