PHP - JSON, ввозврат нескольких строк

229
05 ноября 2017, 19:04

Хочу получить ответ в виде JSON.

Пишу такой скрипт, к которому и обращаюсь:

<?php
    $con = mysqli_connect("localhost", "id1242380_reminduser", "rootroot", "id1242380_remindtbase");
    $user_id = $_POST["user_id"];
    $statement = mysqli_prepare($con, "SELECT * FROM ideas WHERE user_id = ?");
    mysqli_stmt_bind_param($statement, "i", $user_id);
    mysqli_stmt_execute($statement);
    mysqli_stmt_store_result($statement);
    mysqli_stmt_bind_result($statement, $id, $user_id, $title, $text);
    $response = array();
    $response["success"] = false;;
    while(mysqli_stmt_fetch($statement)){
        $response["success"] = true; 
        $response["id"] = $id; 
        $response["user_id"] = $user_id;
        $response["title"] = $title;
        $response["text"] = $text;
    }
    echo json_encode($response);
?>

Но в ответе получаю только одну строку из бд (последнюю). Вот Logcat:

11-04 20:14:15.392 11578-11578/com.example.aydar.remind D/RESPONSETAG: onResponse: {"success":true,"id":3,"user_id":1,"title":"test_title2","text":"test_text2"}

Хотя в БД записано 3 записи и у всеx отличие только в двух последних полях. Поэтому запросу они все удовлетворяют. В чём тут дело?

Answer 1

Вы объявляете $response как массив в PHP. При конвертации в JSON массив преобразуется в объект {} или список [] в зависимости от того ассоциативный ли массив. в цикле while(fetch) вы обходите все записи из БД и записываете значения в поля $response['id'] и т.д. Всё бы ничего, но с каждой новой итерацией while предыдущие данные перезаписываются новыми.

Приведу простой пример вашей нынешней логики без БД и циклов:

$a = 5;
$a = 10;
$a = 7;
echo $a; // Выведет 7. Логично? логично!

Я понятия не имею как вы до этого дошли, но вот простое решение вашей проблемы:

<?php
$con = mysqli_connect('localhost', 'id1242380_reminduser', 'rootroot', 'id1242380_remindtbase');
$user_id = (int) $_POST['user_id'];
$statement = mysqli_prepare($con, 'SELECT * FROM ideas WHERE user_id = ?');
mysqli_stmt_bind_param($statement, 'i', $user_id);
mysqli_stmt_execute($statement);
mysqli_stmt_store_result($statement);
mysqli_stmt_bind_result($statement, $id, $user_id, $title, $text);
$response = ['success' => false];
$rows = [];
while(mysqli_stmt_fetch($statement)){
  $rows[] = [
    'id' => $id,
    'user_id' => $user_id,
    'title' => $title,
    'text' => $text
  ];
}
if(sizeof($rows)) {
  $response['success'] = true;
  $response['response'] = $rows;
}
echo json_encode($response, JSON_PRETTY_PRINT);

В ответе вы получите что-то подобное:

{
  "success": true,
  "response": [{
      "id": 5,
      "user_id": 21354,
      "title": "Купить кегли",
      "text": "Кегли - это очень важно. Нужно их купить."
    },
    {
      "id": 7,
      "user_id": 21354,
      "title": "Волчанка",
      "text": "Саре нужны кортикостероиды."
    }
  ]
}
READ ALSO
Почему возникает ошибка PHP Warning: Module &#39;mongodb&#39; already loaded in Unknown on line 0?

Почему возникает ошибка PHP Warning: Module 'mongodb' already loaded in Unknown on line 0?

Установил драйвер отсюда все сделал по инструкции даже

255
Записать stdout одной программы в stdin другой

Записать stdout одной программы в stdin другой

Есть такая задача: проверить скорость работы программы путём скармливания ей большого количества случайно генерируемых данных данных

287
Как написать свой аллокатор?

Как написать свой аллокатор?

Часто пишут что с не-стандартным аллокатором код может работать быстрее, а как вообще написать свой аллокатор?

456
Список из итераторов на этот же список

Список из итераторов на этот же список

Как сделать список, содержащий итераторы на этот же список? Такой код, очевидно, не компилируется:

300