带引用的call_user_func_array

时间:2011-11-11 23:09:53

标签: php reference mysqli pass-by-reference

我基本上是试图通过call_user_func_array致电mysqli::bind_param

这是我的功能:

function Insert($table, $values=array(), $flags=0) {
    $field_count = count($values);

    if($field_count > 0) {
        $fields = implode(',',array_keys($values));
        $placeholders = implode(',',array_repeat('?',$field_count));
    } else {
        $fields = '';
        $placeholders = '';
    }

    if($flags > 0) {
        $flag_arr = array();
        if($flags & self::LOW_PRIORITY) $flag_arr[] = 'LOW_PRIORITY';
        if($flags & self::DELAYED) $flag_arr[] = 'DELAYED';
        if($flags & self::HIGH_PRIORITY) $flag_arr[] = 'HIGH_PRIORITY';
        if($flags & self::IGNORE) $flag_arr[] = 'IGNORE';
        $flags_str = implode(' ',$flag_arr);
    } else {
        $flags_str = '';
    }

    $sql = "INSERT $flags_str INTO $table ($fields) VALUES ($placeholders)";
    $stmt = $this->mysqli->prepare($sql);
    if($stmt === false) {
        throw new Exception('Error preparing MySQL statement.<br/>MSG: '.$this->mysqli->error.'<br/>SQL: '.$sql);
    }

    if($field_count > 0) {
        $types = '';
        foreach($values as $val) {
            if(is_int($val)) $types .= 'i';
            elseif(is_float($val)) $types .= 'd';
            elseif(is_string($val)) $types .= 's';
            else $types .= 'b';
        }
        $params = array_merge(array($types),array_values($values));
        call_user_func_array(array($stmt,'bind_param'),$params);
    }

    $stmt->execute();
    return $stmt;
}

问题出现在call_user_func_array行。我收到这个错误:

  

参数2到mysqli_stmt :: bind_param()应该是一个参考,给定值

我理解这个问题,我只是不确定如何解决它。

例如,可以像这样调用函数:

$db->Insert('pictures',array('views'=>1));

var_dump($params)会产生这个:

array
  0 => string 'i' (length=1)
  1 => int 1

那么,有没有办法用可变数量的参数调用mysqli::bind_param,或以某种方式使我的数组成为引用?

1 个答案:

答案 0 :(得分:5)

mysqli_stmt::bind_param()州手册页中的第二个注释:

  

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

手册中的用户评论部分发布了 solution 。简而言之,您创建一个接受数组并返回一个重复数组的函数,该数组的元素是对源数组中元素的引用。

修改:结果显示有几个SO questions