如何用call_user_func_array调用mysqli_stmt?

时间:2012-11-26 18:31:47

标签: php mysqli

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

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);
....

这会出错:

  

警告:参数2到mysqli_stmt :: bind_param()应该是一个引用,在..mypath .. \ dbhelper.php中给出的值

在我的另一篇文章(点击here)几个月前的同一个问题上,有些人建议我使用以下代码:

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';
}

调用它会将错误显示为:

  

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

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

PHP的版本是5.3.8。

请帮忙吗?

1 个答案:

答案 0 :(得分: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;
}