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、 essss
如果执行,我将得到以下错误
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。