bind_result в подготовленный оператор PHP mysqli массива

интересно, как я могу связать результаты подготовленного оператора PHP в массив, а затем как я могу их вызвать. например этот запрос

$q = $DBH->prepare("SELECT * FROM users WHERE username = ?");
$q->bind_param("s", $user);
$q->execute();

и это вернет результаты имя пользователя, адрес электронной почты и идентификатор. интересно, могу ли я связать его в массив, а затем сохранить в переменной, чтобы я мог вызывать его на всей странице?


person mcbeav    schedule 21.12.2010    source источник
comment
написано в документах   -  person ajreal    schedule 21.12.2010
comment
в частности, здесь: php.net/manual/en/ mysqli-stmt.bind-result.php#92505   -  person cbrandolino    schedule 21.12.2010
comment
вы можете опубликовать это как ответ, чтобы я мог отметить его правильно.   -  person mcbeav    schedule 22.12.2010


Ответы (3)


В PHP 5.3 появился mysqli_stmt::get_result, который возвращает объект набора результатов. Затем вы можете вызвать mysqli_result::fetch_array() или mysqli_result::fetch_assoc(). Однако он доступен только с родным драйвером MySQL.

person Ian Dunn    schedule 26.06.2012

Эмпирическое правило заключается в том, что если у вас есть более одного столбца в результате, вы должны использовать get_result() и fetch_array() или fetch_all(). Это функции, предназначенные для получения результатов в виде массивов.

Цель bind_result() состояла в том, чтобы связать каждый столбец отдельно. Каждый столбец должен быть привязан к одной ссылке на переменную. Конечно, это не очень полезно, но в редких случаях может пригодиться. В некоторых старых версиях PHP даже не было get_result().

Если вы не можете использовать get_result() и все же хотите извлечь несколько столбцов в массив, вам нужно сделать что-то, чтобы разыменовать значения. Это означает предоставление им нового контейнера zval. Единственный способ, которым я могу придумать это, - использовать цикл.

$data = [];
$q->bind_result($data["category_name"], $data["id"]);
while ($q->fetch()) {
    $row = [];
    foreach ($data as $key => $val) {
        $row[$key] = $val;
    }
    $array[] = $row;
}

Другое решение, упомянутое в комментариях в руководстве по PHP заключается в использовании array_map, который внутренне сделает то же самое, но в одной строке, используя анонимную функцию.

while ($q->fetch()) {
    $array[] = array_map(fn($a) => $a , $data);
}

Оба приведенных выше решения будут иметь тот же эффект, что и следующее:

$q = $DBH->prepare("SELECT * FROM users WHERE username = ?");
$q->bind_param("s", $user);
$q->execute();
$result = $q->get_result();
$array = $result->fetch_all(MYSQLI_ASSOC);
person Dharman    schedule 05.05.2020

См. Вызов неопределенного метода mysqli_stmt::get_result для пример того, как использовать bind_result() вместо get_result() для перебора набора результатов и сохранения значений из каждой строки в массиве с числовым индексом.

person mti2935    schedule 14.07.2016