以下用于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));