Beulah Akindele
Beulah Akindele

Reputation: 15

How to encode json with multiple rows?

Before I begin, I have looked through other examples and Q&A's on multiple platforms but none of them seem to solve my problem. I am trying to return multiple rows from MySQL via a json. However, I have been unable to. The code below shows my attempt.

I get my responses via Postman. The first while returns only the last entry in the database, and the do-while returns all entries but doesn't encode the json properly, as the json outputs syntax error but the html part shows all entries.

<?php
    $dashboard_content_token = $_REQUEST["dashboard_content_token"];
    $token = "g4";

    require(cc_scripts/connect.php);

    $sql = "SELECT * FROM `dashboard_content`";
    $check = strcmp("$token", "$dashboard_content_token");
    $statement = mysqli_query($con, $sql);
    if (check) {
        $rows = mysqli_fetch_assoc($statement);
        if (!$rows) {
            echo "No results!";
        } else {
              while ($rows = mysqli_fetch_assoc($statement)) {
                $news_id = $rows['news_id'];
                $image_url = $rows['image_url'];
                $news_title = $rows['news_title'];
                $news_description = $rows['news_description'];
                $news_article = $rows['news_article'];

                $result['dashboard content: '][] = array('news_id' => $news_id, 'image_url' => $image_url, 'news_title' => $news_title, 'news_description' => $news_description, 'news_article' => $news_article); 

                echo json_encode($result);
        }
        // do {
                // $news_id = $rows['news_id'];
                // $image_url = $rows['image_url'];
                // $news_title = $rows['news_title'];
                // $news_description = $rows['news_description'];
                // $news_article = $rows['news_article'];

                // $result['dashboard content: '][] = array('news_id' => $news_id, 'image_url' => $image_url, 'news_title' => $news_title, 'news_description' => $news_description, 'news_article' => $news_article); 

                // echo json_encode($result);
        //     } while ($rows = mysqli_fetch_assoc($statement));


        mysqli_free_result($statement);
    }
}
?>

Upvotes: 0

Views: 2406

Answers (2)

joeljoeljoel
joeljoeljoel

Reputation: 633

This should work. You'll want to use the do...while statement otherwise the first result is skipped.

<?php
    $dashboard_content_token = $_REQUEST["dashboard_content_token"];
    $token = "g4";

    require(cc_scripts/connect.php);

    $sql = "SELECT * FROM `dashboard_content`";
    $check = strcmp("$token", "$dashboard_content_token");
    $statement = mysqli_query($con, $sql);
    if (check) {
        $rows = mysqli_fetch_assoc($statement);
        if (!$rows) {
            echo "No results!";
        } else {

          do {
             $news_id = $rows['news_id'];
             $image_url = $rows['image_url'];
             $news_title = $rows['news_title'];
             $news_description = $rows['news_description'];
             $news_article = $rows['news_article'];

               $result['dashboard content: '][] = array('news_id' => $news_id, 'image_url' => $image_url, 'news_title' => $news_title, 'news_description' => $news_description, 'news_article' => $news_article); 


          } while ($rows = mysqli_fetch_assoc($statement));

        mysqli_free_result($statement);
        echo json_encode($result);
    }
}
?>

The key is to put all of you results into an array and then just do one json_encode(). When you call json_encode() multiple times, your API will return invalid json.

Upvotes: 1

ADyson
ADyson

Reputation: 61984

In your while loop,

$result['dashboard content: '] = array('news_id' => $news_id, 'image_url' => $image_url, 'news_title' => $news_title, 'news_description' => $news_description, 'news_article' => $news_article); 

just over-writes the same "dashboard content" entry in the $result array every time you run the loop. This is why you only see the last entry.

Doing json_encode() within the loop makes no sense as well, because you'll just output multiple, disconnected individual JSON objects, which are not part of an array or coherent structure. This doesn't make for a valid JSON response.

It's not abundantly clear exactly what output structure you're hoping for, but this might give you either a solution, or at least a shove in the right direction:

$statement = mysqli_query($con, $sql);
$result = array("dashboard_content" => array()); //create an associative array with a property called "dashboard_content", which is an array. (json_encode will convert an associative array to a JSON object)

if (check) {
    $rows = mysqli_fetch_assoc($statement);
    if (!$rows) {
        echo "No results!";
    } else {
          while ($rows = mysqli_fetch_assoc($statement)) {
            $news_id = $rows['news_id'];
            $image_url = $rows['image_url'];
            $news_title = $rows['news_title'];
            $news_description = $rows['news_description'];
            $news_article = $rows['news_article'];

            //append the current data to a new entry in the "dashboard_content" array
            $result["dashboard_content"][] = array('news_id' => $news_id, 'image_url' => $image_url, 'news_title' => $news_title, 'news_description' => $news_description, 'news_article' => $news_article); 
        }
    }

    //now, output the whole completed result to one single, coherent, valid JSON array.
    echo json_encode($result);

You should end up with some JSON like this:

{
  "dashboard_content": [
    {
      "news_id": 1,
      "image_url": "abc",
      "news_title": "xyz",
      //...etc
    },
    {
      "news_id": 2,
      "image_url": "def",
      "news_title": "pqr",
      //...etc
    },
    //...etc
  ]
}

Upvotes: 1

Related Questions