Как динамически связать аргументы mysqli bind_param в PHP?

Я учился использовать подготовленные и связанные операторы для моих запросов sql, и до сих пор я придумал это, это работает нормально, но это совсем не динамично, когда доходит до нескольких параметров или когда параметр не нужен,

public function get_result($sql,$parameter)
    {
        # create a prepared statement
    $stmt = $this->mysqli->prepare($sql);

        # bind parameters for markers
    # but this is not dynamic enough...
        $stmt->bind_param("s", $parameter);

        # execute query 
        $stmt->execute();

    # these lines of code below return one dimentional array, similar to mysqli::fetch_assoc()
        $meta = $stmt->result_metadata(); 

        while ($field = $meta->fetch_field()) { 
            $var = $field->name; 
            $$var = null; 
            $parameters[$field->name] = &$$var; 
        }

        call_user_func_array(array($stmt, 'bind_result'), $parameters); 

        while($stmt->fetch()) 
        { 
            return $parameters;
            //print_r($parameters);      
        }


        # close statement
        $stmt->close();
    }

Так я вызываю классы объектов,

$mysqli = new database(DB_HOST,DB_USER,DB_PASS,DB_NAME);
$output = new search($mysqli);

Иногда мне не нужно передавать какие-либо параметры,

$sql = "
SELECT *
FROM root_contacts_cfm
";

print_r($output->get_result($sql));

Иногда мне нужен только один параметр,

$sql = "
SELECT *
FROM root_contacts_cfm
WHERE root_contacts_cfm.cnt_id = ?
ORDER BY cnt_id DESC
";

print_r($output->get_result($sql,'1'));

Иногда мне нужно только несколько параметров,

$sql = "
SELECT *
FROM root_contacts_cfm
WHERE root_contacts_cfm.cnt_id = ?
AND root_contacts_cfm.cnt_firstname = ?
ORDER BY cnt_id DESC
";

print_r($output->get_result($sql,'1','Tk'));

Итак, я считаю, что эта строка недостаточно динамична для динамических задач, описанных выше,

$stmt->bind_param("s", $parameter);

Чтобы создать bind_param динамически, я нашли это в других сообщениях в Интернете.

call_user_func_array(array(&$stmt, 'bind_params'), $array_of_params);

Я попытался изменить код с php.net , но ничего не добился,

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

       call_user_func_array(array(&$stmt, 'bind_params'), $array_of_params);

     }

Почему? Есть идеи, как заставить его работать?

Или, может быть, есть лучшие решения?

14
задан Benjamin 31 August 2017 в 18:31
поделиться