PHP5.3 - mysqli_stmt:bind_params与call_user_func_array警告

8

我有一行代码,在PHP 5.1中可以工作,但在PHP 5.3中无法工作。

可能是重复问题:
使用call_user_func_array()传递参数的引用是可能的吗?

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

在PHP 5.3中,我收到如下警告消息:

警告:在/var/www/startmission/em/class/cls.data_access_object.php的第785行,mysqli_stmt :: bind_param()的第2个参数期望是引用,但却传递了值。

我将代码更改为以下内容,就可以运行:
$a = 'johnl';
$b = 'programmer';
$mysqli_stmt->bind_param('ss',$a,$b);

我在php文档中找到了这个内容:
注意,在使用mysqli_stmt_bind_param()和call_user_func_array()时需要小心。请注意,mysqli_stmt_bind_param()要求通过引用传递参数,而call_user_func_array()可以接受表示引用或值的变量列表作为参数。
那么我的问题是,我该如何复制call_user_func_array + bind_params的功能,以便我可以在运行时动态绑定变量?

这是关于使用mysqli的call_user_func_array的内容,与链接问题没有任何关系。请仅返回已翻译的文本。 - dewd
1个回答

13

我在PHP手册页面的fabio at kidopi dot com dot br3 years ago的用户笔记中找到了解决问题的答案(稍作修改):

在迁移到PHP 5.3后,我使用call_user_func_arraybind_param时遇到了问题。

原因是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 服务器上继续工作。


这个 refValues 函数编译不通过。它有一些花括号的数量不匹配…你能修复吗? - Jelle
1
你需要先添加类型。$types = 'ss',array_unshift($input,$types);然后上面的函数就能完美运行了。谢谢John。 - apis17

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接