Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php mysqli_stmt_bind_param-需要引用_Php_Mysqli - Fatal编程技术网

Php mysqli_stmt_bind_param-需要引用

Php mysqli_stmt_bind_param-需要引用,php,mysqli,Php,Mysqli,我知道我们必须将引用传递给mysqli\u stmt\u bind\u param。我正在做以下工作 $ref = refValues($data); function refValues($arr){ $refs = array(); foreach($arr as $key => $value) $refs[$key] = &$arr[$key]; var_dump(implode(

我知道我们必须将引用传递给
mysqli\u stmt\u bind\u param
。我正在做以下工作

    $ref = refValues($data);
    function refValues($arr){
        $refs = array();
        foreach($arr as $key => $value)
            $refs[$key] = &$arr[$key];
            var_dump(implode(",", $refs));
            return $refs;
    return $arr;
}
我的所有值都在一个数组中。我正在使用上述函数获取引用

我的PHP版本是5.6

我用以下方式绑定参数

mysqli_stmt_bind_param($stmt, $types, $ref);
$stmt
是通过
mysqli\u prepare
创建的语句。它返回错误号0

$types
不过是
$types=str_pad(“”,count($data),'s')

我还验证了
$types
数据。它返回预期的类型数。i、 e
ssss

如果执行,我将得到以下错误

 Only variables should be passed by reference in test.php
我找到了解决办法。我不能分配100个变量。我不认为这是可行的

我发现另一种选择是调用用户函数数组

$values =  refValues($data);
call_user_func_array(array($stmt, 'bind_param'), $values);
它返回的绑定类型数与值数不匹配。这对我来说很奇怪。我已经验证了数组和值。两个计数都匹配。我不知道call_user_func_数组的内部实现

请告诉我有什么办法可以有效地解决这个问题。

这行

mysqli_stmt_bind_param($stmt, $types, $ref);
表示您有一个要绑定的引用

为什么??让我们看看:

  • 第一个参数是一个语句
  • 第二个参数是类型为的字符串
  • 后面的参数是对应该绑定的值的引用
当您传递一个参数时(它是
$ref
)-您试图只绑定一个值。而
$ref
不是一个引用,它是一个值数组,是引用。看到区别了吗?引用数组vs引用

所以,你采取了第二种方法,这是一种正确的方法:

$values =  refValues($data);
call_user_func_array(array($stmt, 'bind_param'), $values);
这里的错误是什么?您没有传递类型
$types

// do not assign anything to a variable
// pass results of `refValues` directly to `call_user_func_array`
call_user_func_array(array($stmt, 'bind_param'), array_merge(array($types), refValues($data)));
我们在这里做什么:我们试图调用
$stmt->bind_param
并将参数作为数组传递给这个函数

$stmt->bind_param
的参数是什么

  • 第一个参数是类型(
    $types
  • 以下参数是对值的引用(
    $values
现在它应该可以工作了。

这行

mysqli_stmt_bind_param($stmt, $types, $ref);
表示您有一个要绑定的引用

为什么??让我们看看:

  • 第一个参数是一个语句
  • 第二个参数是类型为的字符串
  • 后面的参数是对应该绑定的值的引用
当您传递一个参数时(它是
$ref
)-您试图只绑定一个值。而
$ref
不是一个引用,它是一个值数组,是引用。看到区别了吗?引用数组vs引用

所以,你采取了第二种方法,这是一种正确的方法:

$values =  refValues($data);
call_user_func_array(array($stmt, 'bind_param'), $values);
这里的错误是什么?您没有传递类型
$types

// do not assign anything to a variable
// pass results of `refValues` directly to `call_user_func_array`
call_user_func_array(array($stmt, 'bind_param'), array_merge(array($types), refValues($data)));
我们在这里做什么:我们试图调用
$stmt->bind_param
并将参数作为数组传递给这个函数

$stmt->bind_param
的参数是什么

  • 第一个参数是类型(
    $types
  • 以下参数是对值的引用(
    $values

现在它应该可以工作了。

有两种可能的方法来避免这种麻烦:

  • 使用PDO。您当前的问题只是mysqli中的第一个WTF。在这种特殊情况下,它将像

  • 好吧,你对使用mysqli很有兴趣。然后,只要您使用的是受支持的PHP版本:


  • 有两种可能的方法可以避免这种麻烦:

  • 使用PDO。您当前的问题只是mysqli中的第一个WTF。在这种特殊情况下,它将像

  • 好吧,你对使用mysqli很有兴趣。然后,只要您使用的是受支持的PHP版本:


  • 首先,
    函数refValues($arr){
    创建了
    $data
    @Xorifelse的一个副本。请查看更新的链接。34向上投票获得答案。它不创建引用吗?在您的代码中,
    $ref
    是一个数组(值)它包含引用。
    bind\u param
    第一个参数是类型字符串。@u\u mulder是的。我理解。谢谢。当引用已经存在时,请告诉我为什么该函数需要引用?我做错了什么吗?首先,
    函数refValues($arr){
    创建
    $data
    @Xorifelse的副本。请查看更新的链接。34向上投票获得答案。它不创建引用吗?在您的代码中,
    $ref
    是一个数组(值)它包含引用。
    bind_param
    第一个参数是类型字符串。@u_mulder是的。我理解。谢谢。请在引用已经存在时告诉我为什么该函数需要引用?我做错了什么吗?我收到了“警告:mysqli_stmt::bind_param()的参数2”预期为引用,值为'Any help?@GopsAB use PDO我收到'Warning:mysqli_stmt::bind_param()的参数2预期为引用,值为'Any help?@GopsAB use PDO谢谢。我会考虑升级到PDO。谢谢。我会考虑升级到PDO。