Возможный дубликат:
Можно ли передавать параметры по ссылке с помощью 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.