Call_user_func_array со ссылками
В основном я пытаюсь вызвать mysqli:: bind_param через call_user_func_array
.
Здесь моя функция:
function Insert($table, $values=array(), $flags=0) {
$field_count = count($values);
if($field_count > 0) {
$fields = implode(',',array_keys($values));
$placeholders = implode(',',array_repeat('?',$field_count));
} else {
$fields = '';
$placeholders = '';
}
if($flags > 0) {
$flag_arr = array();
if($flags & self::LOW_PRIORITY) $flag_arr[] = 'LOW_PRIORITY';
if($flags & self::DELAYED) $flag_arr[] = 'DELAYED';
if($flags & self::HIGH_PRIORITY) $flag_arr[] = 'HIGH_PRIORITY';
if($flags & self::IGNORE) $flag_arr[] = 'IGNORE';
$flags_str = implode(' ',$flag_arr);
} else {
$flags_str = '';
}
$sql = "INSERT $flags_str INTO $table ($fields) VALUES ($placeholders)";
$stmt = $this->mysqli->prepare($sql);
if($stmt === false) {
throw new Exception('Error preparing MySQL statement.<br/>MSG: '.$this->mysqli->error.'<br/>SQL: '.$sql);
}
if($field_count > 0) {
$types = '';
foreach($values as $val) {
if(is_int($val)) $types .= 'i';
elseif(is_float($val)) $types .= 'd';
elseif(is_string($val)) $types .= 's';
else $types .= 'b';
}
$params = array_merge(array($types),array_values($values));
call_user_func_array(array($stmt,'bind_param'),$params);
}
$stmt->execute();
return $stmt;
}
Проблема возникает в строке call_user_func_array
. Я получаю эту ошибку:
Параметр 2 к mysqli_stmt:: bind_param() должен быть ссылкой, значение указано
Я понимаю проблему, я просто не уверен, как ее обойти.
В качестве примера можно вызвать такую функцию:
$db->Insert('pictures',array('views'=>1));
И var_dump($params)
даст следующее:
array
0 => string 'i' (length=1)
1 => int 1
Итак, есть ли способ вызвать mysqli::bind_param
с переменным числом аргументов или каким-то образом сделать мой массив ссылкой?
Ответы
Ответ 1
Вторая заметка на странице руководства для mysqli_stmt:: bind_param() утверждает:
Следует соблюдать осторожность при использовании mysqli_stmt_bind_param() в сочетании с call_user_func_array(). Обратите внимание, что mysqli_stmt_bind_param() требует передачи параметров по ссылке, тогда как call_user_func_array() может принимать в качестве параметра список переменных, которые могут представлять ссылки или значения.
В руководстве пользователя содержится решение. Короче говоря, вы создаете функцию, которая принимает массив и возвращает дублирующий массив, элементы которого являются ссылками на элементы в исходном массиве.
Edit: Оказывается, здесь есть пара fooobar.com/info/7793/... questions.