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, чтобы я мог динамически связывать переменные во время выполнения?

Я нашел ответ на мою проблему в примечании пользователя от 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); 

чтобы:

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

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