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.