PHP, передающий массив в качестве параметров функции с использованием (...$array)
Я пытаюсь передать массив в качестве параметров функции, и у меня возникли некоторые проблемы. Вот функция.
$stmt->bind_param();
Я исследовал это и обнаружил, что вы можете использовать это:
$stmt->bind_param(...$values);
Это хорошо работало на моем сервере разработки (PHP 7.0.0), но когда я ввел его на другой сервер (PHP 5.*), я получил следующую ошибку:
синтаксическая ошибка, неожиданная ".", ожидаемая ")"
После дальнейших исследований я попытался:
call_user_func_array(array($stmt, 'bind_param'), $values);
и получил эту ошибку:
call_user_func_array () ожидает, что параметр 1 будет допустимым обратным вызовом, первый член массива не является допустимым именем класса или объектом
* Как примечание, я знаю, что я мог бы просто ввести параметры, и все будет работать нормально, но мне нужно, чтобы функция принимала любое количество параметров (что и привело к идее функции).
Вот функция:
function updateId($id, $data){
$mysqli = dbConnect::connect();
$sm=array();
$values=array();
$dataString = array();
foreach($data as $column=>$value){
$dataString[] = ($column .'= ?');
$values[] = $value;
if(gettype($value)==="string"){
$sm[] = 's';
}elseif(gettype($value)==="integer"){
$sm[] = 'i';
}elseif(gettype($value)==="double"){
$sm[] = 'd';
}else{
$sm[] = 'b';
}
}
$dataString = implode(', ',$dataString);
$sm = implode('',$sm);
$prepString = "UPDATE $this->tablename SET $dataString WHERE id=$id";
array_unshift($values, $sm);
$stmt = $mysqli->prepare($prepString);
$stmt->bind_param(...$values);
$stmt->execute() or die($stmt->error);
$stmt->close();
$mysqli->close();
}
1 ответ
Вы получаете ошибку, потому что вы передаете нереферентные значения bind_param
, Ты можешь использовать call_user_func_array
, но вы должны убедиться, что передаваемые вами значения являются ссылками. Это вы можете достичь следующим образом:
Изменить это:
$values[] = $value;
к этому:
$values[] = &$data[$column];
И (как вы уже сделали) изменить это:
$stmt->bind_param(...$values);
в это:
call_user_func_array(array($stmt, 'bind_param'), $values);