Codementor Events

How to Debug/Fix PHP json_encode() that returns an empty result

Published Jan 17, 2020

If you are building a RESTful API in PHP, then you are most likely using the PHP's json_encode function. json_encode is a PHP function that converts an array to JSON.

In this article, I will discuss how you can fix a json_encode function that returns an empty result or throws an error.

Debugging the error

To solve problems effectively, you should first know what the problem really is.

First, let’s see if there is any error from json_encode. Add the below code in your code after the json_encode() function that you have:

...
echo json_last_error_msg(); // Print out the error if any
die(); // halt the script

Run the script again. If what was printed out is — “No errors”, then there is nothing wrong with the data.

Here is the list of errors you might encounter:

https://secure.php.net/manual/en/function.json-last-error.php#refsect1-function.json-last-error-examples

Fixing “Malformed UTF-8 characters, possibly incorrectly encoded” error

This is one of the common error you will face especially if you are fetching your data from a database.

I encountered this error personally which prompted me to write this article. I was working with a result which I fetched from the database that I converted to JSON. Below is my complete code:

$courses = [];
 $db = new mysqli(HOST, USERNAME, PASSWORD, DATABASE);
 if ($db->connect_error) {
     echo (json_encode([
           'status' => 'error',
           'message' => 'connection to database failed.'
     ]));
     die();
 }
 
 if (isset($_GET['count'])) {
      $allCoursesQuery = "SELECT * FROM `courses`";
      $result = $db->query($allCoursesQuery);
      
      echo json_encode(['count' => $result->num_rows]);
      die();
 }
$allCoursesQuery = "SELECT id, title FROM `courses`";
$result = $db->query($allCoursesQuery);
 
 if ($result->num_rows > 0) {
  while ($row = $result->fetch_assoc()) {
   $courses[] = [
                'id' => $row['id'],
                'title' => $row['title']
   ];
  }
 }
 
echo( json_encode([
   'status' => 'success',
   'data' => $courses
]) );
die();

In the code above, I’m fetching all the courses that are in the courses table that is about 164 records. In the last part of the code, I encode the array of courses to JSON then print out the result.

The result was empty, nothing was printed out. But if I LIMIT the result to like 100 records, I get the JSON printed out but any record I fetch above 100 shows empty. At first, I thought it might be a memory issue (but 164 records is not that much 😕). I went ahead to increase my memory limit but that did not help. It was not memory related.

After much trial and error, I decided to see what json_encode is complaining about if any. So I placed the code after the json_encode(…) function:

echo json_last_error_msg(); // Print out the error if any
die(); // halt the script

Now, I see the error!:

Malformed UTF-8 characters, possibly incorrectly encoded

This error happens if the result contains mixed encoding characters
.
To fix it, I introduced JSON_UNESCAPED_UNICODE:

   'status' => 'success',
   'data' => $courses
], JSON_UNESCAPED_UNICODE) );

Conclusion

In this article, you have learned how to debug common json_encode() errors and how to get them fixed. Although we did not discuss how to fix all of the errors independently, I strongly believe you can take it from there as you have known what the error message.

Discover and read more posts from Onwuka Gideon
get started