Я работаю над приведенным ниже кодом. Почему я получаю только одну строку в моем выводе JSON?
$items = [];
if ($stmt = $this->conn->prepare("SELECT * FROM $tbl")) {
$stmt->execute();
$result = $stmt->get_result();
if ($result->num_rows > 0) {
while ($row = $result->fetch_assoc()) {
$items = $row;
}
$stmt->free_result();
$stmt->close();
}
$this->conn->close();
}
echo json_encode($items);






$items[] = $row; решит проблему.
Это происходит потому, что вы просматриваете строки и назначаете каждую из них $items:
while ($row = $result->fetch_assoc()) {
$items = $row;
}
Таким образом, после завершения цикла вы получаете переменную, которая является $row, которая была назначена во время последней итерации этого цикла.
Вам нужно будет вставить значения в массив следующим образом:
$items[] = $row;
Попробуйте с функцией array_push:
$items = array();
if ($stmt = $this->conn->prepare("SELECT * FROM $tbl")) {
$stmt->execute();
$result = $stmt->get_result();
if ($result->num_rows > 0) {
while ($row = $result->fetch_assoc()) {
array_push($items, $row);
}
$stmt->free_result();
$stmt->close();
}
$this->conn->close();
}
echo json_encode($items);
Согласно Паоло Бергантино - Что лучше использовать в PHP $array[] = $value или array_push($array, $value)?
Он говорит:
If you use array_push() to add one element to the array it's better to use $array[] = because in that way there is no overhead of calling a function.
для решения вашей проблемы вы должны изменить эту часть кода:
while ($row = $result->fetch_assoc()) {
$items = $row;
}
К:
while ($row = $result->fetch_assoc()) {
$items[] = $row;
}
Но если вы используете PDO, я думаю, что лучше сделать это, изменив эту часть кода:
$items = [];
if ($stmt = $this->conn->prepare("SELECT * FROM $tbl")) {
$stmt->execute();
$result = $stmt->get_result();
if ($result->num_rows > 0) {
while ($row = $result->fetch_assoc()) {
$items = $row;
}
$stmt->free_result();
$stmt->close();
}
$this->conn->close();
}
К:
if ($stmt = $this->conn->prepare("SELECT * FROM $tbl")) {
$stmt->execute();
$items = $stmt->fetchAll(PDO::FETCH_ASSOC);
}
И убрать цикл while.
Пожалуйста, объясните Зачем, что необходимы изменения, чтобы OP мог узнать, что было не так.
Что ты имеешь в виду? Почему вы не хотите добавить некоторые пояснения?
Это можно объяснить подробно, но я думаю, что лучше пойти в блоги для более подробной информации, я сказал короткий комментарий, чистый код Если вы не верите в чистый код, мы должны узнать, что думают другие.
В какие «блоги» мне идти и какое отношение к чистому коду? Пожалуйста, имейте в виду, что люди, которые обращаются за помощью к SO, стремятся узнать что-то новое. Если вы не объясните им, почему ваш код решает проблему, они не смогут извлечь уроки из вашего ответа и не смогут написать лучший код в будущем.
Причина, по которой вы получаете только одну строку в JSON, заключается в том, что в вашем цикле while вы каждый раз перезаписываете одну и ту же переменную, а не вставляете ее в массив. Простое исправление было бы сделать:
while ($row = $result->fetch_assoc()) {
$items[] = $row;
}
Это также можно записать с помощью цикла foreach.
foreach($result as $row) {
$items[] = $row;
}
Вам вообще не нужна эта петля while. Вы можете сделать свой код намного проще, если будете использовать fetch_all(). Вы можете просто заменить весь свой код из вопроса на:
$stmt = $this->conn->prepare("SELECT * FROM $tbl");
$stmt->execute();
$result = $stmt->get_result();
$items = $result->fetch_all(MYSQLI_ASSOC);
echo json_encode($items);
fetch_all(MYSQLI_ASSOC) предоставит вам все строки в ассоциативных массивах.
вы просто пропустили указание, что $items - это массив с []. Голосую за закрытие как опечатка