Что делают & symbol и call_user_func_array (массив ($ stmt, "bind_param"), $ value) в php? - PullRequest
0 голосов
/ 05 января 2020

Я хочу сделать myqsli_stmt_bind_param, используя call_user_func_array(), потому что у меня есть динамические значения, которые должны быть переданы в запрос.

Сначала я попытался просто поставить мой $bind_params[] = [$type, $value] (без &) как второй параметр call_user_func_array(). И во второй попытке я помещаю свой $bind_params[] = [&$type, &$value] в качестве второго параметра call_user_func_array().

Моя первая пробная версия это (без &):

// To store all collected type into $bind_params[].
$bind_params = array($bind_params_1);

$count = count($bind_params_2);

// To store the all values into $bind_params[].
// $bind_params_2[] is collected $_POST values.
for ($i=0; $i < $count; $i++) { 
    $bind_params[] = $bind_params_2[$i]; 
    $i++;
}

// Doing $stmt->bind_params($bind_params_1, $bind_params_2).
call_user_func_array(array($stmt, "bind_param"), $bind_params);
$stmt->execute();

Если я запустил код выше, это будет выдает предупреждение и ошибку:

Предупреждение: параметр 2 для mysqli_stmt :: bind_param () должен быть ссылкой, значение указано в C: \ xampp \ htdocs \ dashboard \ x \ xx \ xxx \ xxxx \ xxxxx \ gb_daftar_usulan. php в строке 571

Неустранимая ошибка: вызов функции-члена fetch_asso c () для логического значения в C: \ xampp \ htdocs \ dashboard \ x \ xx \ xxx \ xxxx \ xxxxx \ gb_daftar_usulan. php в строке 584

И тогда мое второе испытание выглядит так (с помощью &):

// To store all collected type into $bind_params[].
$bind_params = array(&$bind_params_1);

// $bind_params_2[] is collected $_POST values.
$count = count($bind_params_2);

// To store the all values into $bind_params[].
for ($i=0; $i < $count; $i++) { 
    $bind_params[] = &$bind_params_2[$i]; 
    $i++;
}

// Doing $stmt->bind_params($bind_params_1, $bind_params_2).
call_user_func_array(array($stmt, "bind_param"), $bind_params);
$stmt->execute();

Второй код дает правильный результат для меня. Я нашел этот подход отсюда: ({ ссылка }).

Почему это произошло?

Что именно & в &$bind_params_1 и &$bind_params_2 значит?

Почему мое первое испытание дало предупреждение и ошибку?

1 Ответ

0 голосов
/ 05 января 2020

Ссылка & на переменную, это означает, что она передает адрес в памяти функции () и не копирует значение в новую часть памяти. Как это работает, смотрите здесь: Передача по ссылке -> PHP -Docu и как @Brama toled, прочитайте, как Ссылки работают

Вы можете найти описания с примерами к функции в PHP -Документации call_user_func_array ()

Возвращает возвращаемое значение обратного вызова или FALSE при ошибке.

Warning: Parameter 2 to mysqli_stmt::bind_param() expected to be a reference, value given in C:\xampp\htdocs\dashboard\x\xx\xxx\xxxx\xxxxx\gb_daftar_usulan.php on line 571

Fatal error: Call to a member function fetch_assoc() on boolean in C:\xampp\htdocs\dashboard\x\xx\xxx\xxxx\xxxxx\gb_daftar_usulan.php on line 584

Предупреждение означает, что ожидаемый параметр не может быть обработан, по этой причине фатальная ошибка, потому что fetch_assoc() ожидает правильный результат DB

Это можно предотвратить с помощью:

if ($result = $mysqli->query($query)) {

/* fetch associative array */
while ($row = $result->fetch_assoc()) {
    printf ("%s (%s)\n", $row["Name"], $row["CountryCode"]);
}

/* free result set */
$result->free();
}

источник: PHP -Руководство

...