Php mysqli_stmt::bind_param变量数不';t匹配已准备语句中的参数数

Php mysqli_stmt::bind_param变量数不';t匹配已准备语句中的参数数,php,mysqli,Php,Mysqli,这是创建准备好的语句的函数: 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

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

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;
}
$values\u数组是

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)
}  

我无法找出问题所在,因为只有将参数绑定到insert语句时才会引发此错误。Select语句工作正常

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

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

  • 通过使用
    bindValue()
    或将数组传递给
    execute()
    ,按值绑定占位符
  • 将查询结果作为常规数组返回,而不是单独变量的奇怪绑定
    now()
    无法工作,因为它是作为文本字符串传递的。您可以尝试使用可选的
    ->bind_param
    签名,将类型字符串与所有参数一起传递,
    调用用户函数数组(array($stmt,“bind_param”),$values_array)
    将now()省略时出现相同的错误。是的,我知道call_user_func_数组函数,但是我需要重新构造$values_数组,这是我不想做的。刚刚测试了PDO,它可以正常工作。多么奇怪的问题+1.
    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)
    }