将数组动态转换为变量并将其用作函数参数


Convert array to variables dynamically and use them as function arguments

我需要在数据处理期间进行大量mysql查询。由于实际的代码几乎没有变化,我想用一个函数来封装它。这样的函数可以如下所示:

// input: sql statement, binding parameters and paramter types
private prepared_statement($query, $params, $param_string) {
        // I use this peace of code over and over again
        $stmt = $this->db->prepare($query);
        if (!$stmt) {//TODO log
            echo "Error in prepared statement";
        }
        // problem
        $stmt->bind_param($param_string, $param1, $param2, ...);
        $stmt->execute();
        // problem
        $stmt->bind_result($);
        $stmt->fetch();
        $stmt->close(); 
        //...  
    }

第二个函数实参是一个数组,其中包含要执行的查询的所有绑定形参。我不知道如何将它们传递给bind_param函数,因为它只接受绑定参数作为单个变量。

是否可以动态地将param数组转换为变量,然后可以传递给bind_param ?

此外,我想知道如何最好地绑定结果,因为我不知道将返回多少结果。

如果你有一个这样的数组:

$array = Array("name"=>"Jhon","surname"=>"Conor");

你可以:

extract($array);

,然后像这样使用:

echo "Your name is " . $name . " and your surname is " . $surname;

在Jon使用call_user_func_array的建议的帮助下,我设法得到了以下解决方案:

private function prepared_statement($query, $params, $param_string) {
        $fetched_data = array();
        $binding_params[] = & $param_string;
        foreach($params as &$current_param) {
            $binding_params[] = & $current_param;
        }
        $stmt = $this->db->prepare($query);
        if (!$stmt) {
            //TODO log
            echo "Error in prepared statement";
        }
        call_user_func_array(array($stmt, "bind_param"), $binding_params);
        $stmt->execute();   
        $result = $stmt->get_result();
        while($row = $result->fetch_array(MYSQLI_ASSOC)) {
            foreach($row as $r) 
                array_push($fetched_data, $r);
        }
        $stmt->close(); 
        return $fetched_data;
    }

您可以使用两次'$'来获取变量:

foreach($my_arr AS $k => $v){
    $$k = $v;
}