PHP MySQLi просто возвращает одну строку в JSON

Я работаю над приведенным ниже кодом. Почему я получаю только одну строку в моем выводе 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 - это массив с []. Голосую за закрытие как опечатка

Lelio Faieta 07.02.2019 17:44
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
1
71
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

$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 мог узнать, что было не так.

Nico Haase 07.02.2019 17:54

Что ты имеешь в виду? Почему вы не хотите добавить некоторые пояснения?

Nico Haase 07.02.2019 18:32

Это можно объяснить подробно, но я думаю, что лучше пойти в блоги для более подробной информации, я сказал короткий комментарий, чистый код Если вы не верите в чистый код, мы должны узнать, что думают другие.

Sajad Mirzaei 08.02.2019 05:50

В какие «блоги» мне идти и какое отношение к чистому коду? Пожалуйста, имейте в виду, что люди, которые обращаются за помощью к SO, стремятся узнать что-то новое. Если вы не объясните им, почему ваш код решает проблему, они не смогут извлечь уроки из вашего ответа и не смогут написать лучший код в будущем.

Nico Haase 08.02.2019 07:55

Причина, по которой вы получаете только одну строку в 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) предоставит вам все строки в ассоциативных массивах.

Другие вопросы по теме