2010-09-09 27 views
8

可能重复:
Is it possible to pass parameters by reference using call_user_func_array()?PHP5.3 - mysqli_stmt:bind_params与call_user_func_array警告

我有这在PHP 5.1的工作下面的代码行,但不是在工作PHP 5.3。

$input = array('ss','john','programmer'); 
call_user_func_array(array($mysqli_stmt, 'bind_param'), $input); 

在PHP 5.3时,得到以下警告消息:

警告:参数2至mysqli_stmt :: bind_param()预计是一个参考,值在/ var/WWW/startmission给出/em/class/cls.data_access_object.php上线785

我改变了代码以下和它的工作:

$a = 'johnl'; 
$b = 'programmer'; 
$mysqli_stmt->bind_param('ss',$a,$b); 

我发现这个PHP文档中:

护理必须与call_user_func_array 结合使用mysqli_stmt_bind_param()时,应考虑()。请注意, mysqli_stmt_bind_param()需要通过引用传递参数 ,而call_user_func_array()可以接受可以表示引用或值的变量列表 作为参数。

所以我的问题是,如何复制call_user_func_array + bind_params的功能,以便我可以在运行时动态绑定变量?

+0

这不是一个链接到的重复。这具体是关于call_user_func_array WITH mysqli。链接的问题根本与mysqli没有任何关系。 – dewd 2014-03-21 16:12:20

回答

13

我找到了答案,我的问题在用户说明fabio at kidopi dot com dot br3 years ago on the PHP manual page of mysqli_stmt::bind_param()(略有修改):

我曾经有call_user_func_arraybind_param问题移植到PHP 5.3之后。

原因是5.3需要数组值作为参考,而5.2使用实际值(但也带有引用)。所以,我创建了一个次要的辅助功​​能,以帮助我:

function refValues($arr) 
{ 
     $refs = array(); 

     foreach ($arr as $key => $value) 
     { 
      $refs[$key] = &$arr[$key]; 
     } 

     return $refs; 
} 

和改变了我以前的功能:

call_user_func_array(array($this->stmt, "bind_param"), $this->values); 

到:

call_user_func_array(array($this->stmt, "bind_param"), refValues($this->values)); 

这样,我的数据库功能保持工作在PHP 5.2/5.3服务器中。

+0

这个refValues函数不能编译。它有大量的大括号不匹配...你能解决它吗? – Jelle 2013-05-01 19:23:32

+1

您需要先添加类型。 $ types ='ss',array_unshift($ input,$ types);那么上面的功能将会很好地工作。谢谢约翰。 – apis17 2013-12-11 10:22:03