以下用于bind_param PHP的to方法之间有什么区别
我刚刚结束使用单例方法,开始准备语句。。。我绞尽脑汁想为什么一个版本有效,而另一个版本无效,在我看来,它们似乎是一样的。。。我真的希望它以第二种方式工作,以实现我的最终目标 这项工作:以下用于bind_param PHP的to方法之间有什么区别,php,prepared-statement,Php,Prepared Statement,我刚刚结束使用单例方法,开始准备语句。。。我绞尽脑汁想为什么一个版本有效,而另一个版本无效,在我看来,它们似乎是一样的。。。我真的希望它以第二种方式工作,以实现我的最终目标 这项工作: call_user_func_array(array($stmt, 'bind_param'), array("i", 2)); 这并不是: $params = array("i", 2); call_user_func_array(array($stmt, 'bind_param'), $params);
call_user_func_array(array($stmt, 'bind_param'), array("i", 2));
这并不是:
$params = array("i", 2);
call_user_func_array(array($stmt, 'bind_param'), $params);
您可能会收到如下错误消息: mysqli_stmt::bind_param()应为引用,值在 问题是PHP5.3+中的
bind_param()
需要数组值作为参考,而5.2则使用实值
从:
与调用用户函数数组()配合使用mysqli\u stmt\u bind\u param()时必须小心。请注意,mysqli\u stmt\u bind\u param()要求通过引用传递参数,而call\u user\u func\u array()可以接受可以表示引用或值的变量列表作为参数()
一种解决方案是创建一个引用数组
$params = array("i", 2);
$tmp = array();
foreach($params as $key => $value) {
$tmp[$key] = &$params[$key];
}
call_user_func_array(array($stmt, 'bind_param'), $tmp);
另一个类似的例子是
这是我最不喜欢mysqli的地方,也是PDO总是能为meAmazing赢得胜利的原因。我喜欢第二种解决方案+1为了深入了解这个问题,我已经多次遇到类似的问题,但只是想略过它,您能解释一下为什么它更倾向于作为参考而不是值传递,有什么理由这样做吗
function refValues($arr){
if (strnatcmp(phpversion(),'5.3') >= 0) //Reference is required for PHP 5.3+
{
$refs = array();
foreach($arr as $key => $value)
$refs[$key] = &$arr[$key];
return $refs;
}
return $arr;
}
$params = array("i", 2);
call_user_func_array(array($stmt, 'bind_param'), refValues($params));