Эмпирическое правило заключается в том, что если у вас есть более одного столбца в результате, вы должны использовать 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