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