2

我正在尝试将可变数量的参数传递给类的方法。这是我试图调用的类的函数:

class DbHelper{
....
    public function Execute($query, $params){
        $this->open();
        $stmt = $this->mysqli->prepare($query) or die($this->mysqli->error);
        call_user_func_array(array($stmt, 'bind_param'), $params);  // 1
        return $stmt->execute() ? $stmt->num_rows : 'ERROR';
    }
....
}

这是我用来调用该函数的代码:

....
$conn = new DbHelper();
$params = array('ss', $ID, $i);
$conn->Execute('INSERT INTO some_table (ID, `Index`) VALUES (?,?)', $params);
....

这给出了一个错误:

警告:mysqli_stmt::bind_param() 的参数 2 应为参考,在线 ..mypath..\dbhelper.php 中给出的值

在几个月前关于同一问题的另一篇文章(单击此处)中,有人建议我使用以下代码:

call_user_func_array(array($stmt, 'bind_param'), refValues($params));

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 之前添加 &):

$conn->Execute('INSERT INTO some_table (ID, `Index`) VALUES (?,?)', &$params); // 2

我收到此错误:

已弃用:在线上的 ..mypath..\save.php 中已弃用调用时传递引用

或者,我已经尝试过这个函数的定义DbHelper::Execute

public function Execute($query, $params){
    $this->open();
    $stmt = $this->mysqli->prepare($query) or die($this->mysqli->error);
    $stmt->{'bind_param'}($params); // 3
    return $stmt->execute() ? $stmt->num_rows : 'ERROR';
}

调用它显示错误为:

警告:在线 ..mypath..\dbhelper.php 中 mysqli_stmt::bind_param() 的参数计数错误

其中,如果函数调用正确,则参数计数对于 bind_param 是正确的。

PHP 的版本是 5.3.8。

请问有什么帮助吗?

4

1 回答 1

3

向您建议的功能也需要$params通过引用接受。这是一个稍微更新的版本:

function refValues(&$arr)
{
    //Reference is required for PHP 5.3+
    if (strnatcmp(phpversion(),'5.3') >= 0)
    {
        $refs = array();
        foreach(array_keys($arr) as $key)
        {
            $refs[$key] = &$arr[$key];
        }
        return $refs;
    }

    return $arr;
}
于 2012-11-26T20:29:14.390 回答