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);
Другие вопросы по тегам