json_encode在PDO获取的数据上不起作用。
json_encode在PDO获取的数据上不起作用。
我这里卡住了。用户在一个选择列表上点击一个选项,然后jQuery发送一个xhr到服务器进行处理,这里没有什么特别的,代码完美运行(firebug显示正确的发布数据)。
然后通过一个简单的代码从数据库中返回W_id == $val
的行,然后在$result
中获取结果,然后以json响应的形式输出结果:
public function getCities($val) { $sth = $this->db->prepare("SELECT id, name FROM cities WHERE w_id = :w_id"); $sth->execute(array(':w_id' => $val)); $result = $sth->fetchAll(PDO::FETCH_ASSOC); //print_r($result); header("content-type:application/json"); echo json_encode($result); }
Firebug显示了发布数据,但没有响应。但当我取消注释print_r
时,它以一个数组的形式显示给我作为响应:
Array( [0] => Array( [id] => 1401 [name] => Aïn Bouchekif ) [1] => Array( [id] => 1402 [name] => Aïn Deheb ) [2] => Array( [id] => 1403 [name] => Aïn El Hadid ) 等等...
这意味着可以返回结果,但我不知道如何将它们转换为json格式。感谢任何帮助。
问题的出现原因是编码问题。可以通过使用json_last_error()函数来验证这个想法。可以在头部添加charset=utf-8:
$result = $sth->fetchAll(PDO::FETCH_ASSOC); //print_r($result); header("Content-type: application/json; charset=utf-8"); // <-- 这里 echo json_encode($result); echo json_last_error(); // <-- 这里
使用echo json_last_error()函数后,成功地触发了success方法,并且作为响应得到了5。手册中说这是格式错误的UTF-8字符,可能是由于 ï 的错误编码导致的。
解决方法是将编码设置为utf-8,可以在头部添加charset=utf-8:
header("Content-type: application/json; charset=utf-8"); // <-- 这里
这样就可以正确地编码和解析json数据了。
问题出现的原因是在使用PDO获取的数据上使用json_encode时,无法正常工作。这可能是因为数据中包含特殊字符或非UTF-8编码的字符。
解决方法是在使用json_encode之前,对数据进行UTF-8编码处理。可以使用array_map函数将utf8_encode函数应用于每个数据行,将其转换为UTF-8编码。然后使用json_encode将数据编码为JSON格式。
下面是解决方法的示例代码:
public function getCities($val) { $sth = $this->db->prepare("SELECT id, name FROM cities WHERE w_id = :w_id"); $sth->execute(array(':w_id' => $val)); header("Content-type: application/json; charset=utf-8"); $rows = array(); while ($row = $sth->fetch(PDO::FETCH_ASSOC)) { $rows[] = array_map('utf8_encode', $row); } echo json_encode($rows); }
这段代码中,首先设置了响应头的Content-type为application/json; charset=utf-8,确保返回的数据以UTF-8编码进行传输。然后在循环遍历数据行时,使用array_map函数将utf8_encode函数应用于每个数据行,将其转换为UTF-8编码。最后使用json_encode将数据编码为JSON格式并输出。
通过这种方式,可以确保PDO获取的数据在使用json_encode时正常工作,并且能够正确地编码包含特殊字符或非UTF-8编码的数据。