使用json_encode回显数组

时间:2015-04-26 01:20:09

标签: php mysql json pdo

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

对于某些查询,GET请求不返回任何响应,尽管在工作台中测试查询会返回数千条记录。我尝试打开错误 - 不会产生错误。我尝试增加内存限制 - 这不是罪魁祸首。我试图输出PDO错误/警告 - 没有生成,PDO实际返回记录,我使用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!

3 个答案:

答案 0 :(得分:3)

编辑:

使用utf8_encode()然后按照此处提到的json_encode()(Special apostrophe breaks JSON

OR

$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可以使用共享服务器的内存。

很抱歉,如果我没有你想要的那么有用,但我们无法真正测试你的代码,你必须为我们做。

答案 1 :(得分:2)

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

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

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

它应返回一个整数,指定以下错误之一。

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

在我的情况下它返回了5.然后我必须清理每个“描述”列才能工作。如果是同样的错误,我已经包含了运行所有列以清除它们所需的功能。

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

答案 2 :(得分:0)

使用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();