Echo json_encode无法处理某些实例

use*_*608 2 php json

我目前正在使用php回应我的网页的json响应,并在某些情况下遇到问题.我无法弄清楚是什么导致了这一点.我使用的sql语句如下所示:

"SELECT * 
        FROM table
        WHERE id = $id
        LIMIT 20 OFFSET $offset"
Run Code Online (Sandbox Code Playgroud)

唯一改变的是$offset用户切换页面的时间.我有8页数据,第7页和第8页都没有返回数据,而其他所有数据都没有.当我将此sql语句复制到我的数据库中进行测试时,它会正确检索数据.

这里我是如何回应json的:

while ($row = mysqli_fetch_array($fetch, MYSQLI_ASSOC)) {
    $row_array['id'] = $row['id'];
    $row_array['title'] = $row['title'];
    $row_array['description'] = $row['description'];
    array_push($return_arr,$row_array); 
    //echo json_encode($return_arr);  <-- this returns JSON
}

echo json_encode($return_arr);
Run Code Online (Sandbox Code Playgroud)

在除第7页和第8页之外的所有页面上,它返回正确的JSON,但由于某种原因,在这两个页面上,echo不执行任何操作.如果我将json放在我注释掉的循环中,它将为第7页和第8页返回正确的json,这是奇怪的.我在验证器中检查了json,它是有效的json.有没有办法检查错误或调试此错误?

q.T*_*hen 13

就在这里.我认为可能发生的是你的一些行包含非utf8编码的字符.json_encode如果发生这种情况则失败,只返回false.你可以用一个来检查它is_bool.

http://php.net/manual/en/function.json-encode.php

value
The value being encoded. Can be any type except a resource.

All string data must be UTF-8 encoded.
Run Code Online (Sandbox Code Playgroud)

解决这个mysqli_set_charset($dbc, 'utf8');问题的一个天真的解决方案是,尽管问题更深入,你应该考虑正确转换所有字符以避免丢失字节.

  • 从 PHP7.2 开始,你可以使用 `json_encode($data,JSON_INVALID_UTF8_IGNORE)` 来解决这个问题! (2认同)