使用 json_encode 回显数组

Echoing an array using json_encode

使用 javascript 应用程序,我正在为搜索功能发出服务器端请求。它适用于某些查询,但不适用于其他查询。

对于某些查询,GET 请求 returns 没有响应,尽管在 workbench returns 数千条记录中测试查询。我尝试打开错误 - 没有生成错误。我尝试增加内存限制 - 这不是罪魁祸首。我尝试输出 PDO errors/warnings - 没有生成,PDO 实际上是 returns 记录,我使用 var_dump 验证了这一点,如下所示。

总而言之,下面代码中的所有内容似乎都可以完美运行,直到负责将数组编码为 json 对象的最后一行 - 它什么也没回显。

感谢您为解决此问题提供的任何帮助。

PHP

error_reporting(E_ALL);
ini_set('display_errors', 1);
ini_set('memory_limit', '2048M');
$db = new PDO('mysql:host=localhost;dbname=mydb', 'root', '');

$search = $_GET['search'];
$searchBy = ( isset($_GET['searchBy']) && !empty($_GET['searchBy']) ) ? $_GET['searchBy'] : 'name';


$sql = "SELECT * FROM business WHERE name LIKE '%university%' GROUP BY id"; 
$query = $db->prepare($sql);
$query->execute();
$results = $query->fetchAll(); //query returns 5000+ records in under a second in workbench

$headers = array('Business', 'City', 'State', 'Zip', 'Phone');


$json = array("results" => $results, 'headers' => $headers, 'query' => $sql);
var_dump($json); //prints successfully 

echo json_encode($json); // echos nothing!

编辑:

使用 utf8_encode() 然后使用 json_encode() 如此处所述 (Special apostrophe breaks JSON)

$dbHandle = new PDO("mysql:host=$dbHost;dbname=$dbName;charset=utf8", $dbUser, $dbPass,array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'"));

会解析所有utf8格式的数据。

这样做的结果是什么?

echo json_encode($results);
//scratch those
//$json = array("results" => $results, 'headers' => $headers, 'query' => $sql);
//var_dump($json); //prints successfully 

可能是你 运行 内存不足?尝试 100 个结果。我从其他项目的经验中知道 json_encode 可以消耗共享服务器的内存。

抱歉,如果我没有像您希望的那样提供帮助,但我们无法真正测试您的代码,您必须为我们做。

前几天我尝试使用 json_encode 时遇到了这个确切的错误。它 return 没有错误...只是一个空白屏幕,最后它击中了我。问题在于字符编码。我试图使用的专栏已被撰稿人使用,他们从 Microsoft Word 直接剪切并粘贴到所见即所得中。

回显 json_last_error() 在你的 json_encode 之后看看你得到什么

.
.
.
echo json_encode($json); // echos nothing!
echo json_last_error(); // integer if error hopefully 0

它应该 return 一个指定以下错误之一的整数。

0 = JSON_ERROR_NONE
1 = JSON_ERROR_DEPTH
2 = JSON_ERROR_STATE_MISMATCH
3 = JSON_ERROR_CTRL_CHAR
4 = JSON_ERROR_SYNTAX
5 = JSON_ERROR_UTF8

在我的例子中,它 return 为 5。然后我必须清理每个 "description" 列才能工作。如果出现相同的错误,我已经包含了您需要 运行 所有列以清除它们的功能。

function utf8Clean($string)
{
    //reject overly long 2 byte sequences, as well as characters above U+10000 and replace with *
    $string = preg_replace('/[\x00-\x08\x10\x0B\x0C\x0E-\x19\x7F]'.
     '|[\x00-\x7F][\x80-\xBF]+'.
     '|([\xC0\xC1]|[\xF0-\xFF])[\x80-\xBF]*'.
     '|[\xC2-\xDF]((?![\x80-\xBF])|[\x80-\xBF]{2,})'.
     '|[\xE0-\xEF](([\x80-\xBF](?![\x80-\xBF]))|(?![\x80-\xBF]{2})|[\x80-\xBF]{3,})/S',
     '*', $string );

    //reject overly long 3 byte sequences and UTF-16 surrogates and replace with ?
    $string = preg_replace('/\xE0[\x80-\x9F][\x80-\xBF]'.
     '|\xED[\xA0-\xBF][\x80-\xBF]/S','?', $string );

    return $string;
}

有关 json_last_error() 的更多信息,请转到源代码! http://php.net/manual/en/function.json-last-error.php

使用 JSON Builder 非常简单:Simple JSON for PHP

include('includes/json.php');

$Json = new json();

$Json->add('status', '200');
$Json->add('message', 'Success');
$Json->add('query', 'sql');
$Json->add("headers",$headers);
$Json->add("data",$results);

$Json->send();