Php5.3 - mysqli_stmt: bind_params с предупреждениями call_user_func_array

Возможный дубликат:
Можно ли передавать параметры по ссылке с помощью call_user_func_array()?

У меня есть следующая строка кода, которая работала в PHP 5.1, но не работает в PHP 5.3.

$input = array('ss','john','programmer');
call_user_func_array(array($mysqli_stmt, 'bind_param'), $input);

В PHP 5.3 появляется следующее предупреждающее сообщение:

Предупреждение. Параметр 2 для mysqli_stmt:: bind_param() ожидается как ссылка, значение указано в /var/www/startmission/em/class/cls.data_access_object.php в строке 785

Я изменил код на следующий, и он сработал:

$a = 'johnl';
$b = 'programmer';
$mysqli_stmt->bind_param('ss',$a,$b);

Я нашел это в документации php:

Следует соблюдать осторожность при использовании mysqli_stmt_bind_param() в соединение с call_user_func_array(). Обратите внимание, что mysqli_stmt_bind_param() требует, чтобы параметры передавались по ссылке, тогда как call_user_func_array() может принимать в качестве параметра список переменные, которые могут представлять ссылки или значения.

Итак, мой вопрос: как мне реплицировать функции call_user_func_array + bind_params, чтобы я мог динамически связывать переменные во время выполнения?

Ответ 1

Я нашел ответ на мою проблему в записке пользователя fabio at kidopi dot com dot br3 лет назад на странице руководства PHP mysqli_stmt::bind_param() (слегка измененный):

У меня были проблемы с call_user_func_array и bind_param после перехода на php 5.3.

Причиной является то, что 5.3 требует значения массива в качестве ссылки, а 5.2 работает с реальными значениями (но также со ссылками). Поэтому я создал вспомогательную вспомогательную функцию, которая поможет мне в этом:

function refValues($arr)
{ 
        $refs = array();

        foreach ($arr as $key => $value)
        {
            $refs[$key] = &$arr[$key]; 
        }

        return $refs; 
}

и изменил мою предыдущую функцию:

call_user_func_array(array($this->stmt, "bind_param"), $this->values); 

to:

call_user_func_array(array($this->stmt, "bind_param"), refValues($this->values)); 

Таким образом, мои функции db продолжают работать на серверах PHP 5.2/5.3.