json_encode 不适用于 PDO 获取的数据

Posted

技术标签:

【中文标题】json_encode 不适用于 PDO 获取的数据【英文标题】:json_encode not working on PDO fetched data 【发布时间】:2015-04-12 05:52:00 【问题描述】:

我在这里挂了。用户单击选择列表上的选项,然后 jQuery 将 xhr 发送到服务器进行处理,这里没什么特别的,代码运行良好(firebug 显示正确的 Posted 数据)。

然后一个简单的代码从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 显示 Post 数据但没有响应。但是当我取消注释 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
    ) and so on...

这意味着有结果可以返回,但我不知道如何将它们json化。任何帮助表示赞赏,谢谢。

【问题讨论】:

如果您跳过标题,它会打印任何内容吗? echo json_encode($result)之后尝试echo json_last_error() 我认为,错误标题中的问题。尝试全面检查 http 请求/响应标头。 你在使用php框架吗? 如果没有,检查方法是如何被使用的,也许用return替换echo然后:echo getCities($val) 【参考方案1】:

我认为是编码问题,你可以通过json_last_error()来验证这个想法。您可以将charset=utf-8 添加到标题中:

$result = $sth->fetchAll(PDO::FETCH_ASSOC);
//print_r($result);
header("Content-type: application/json; charset=utf-8"); // <-- Here
echo json_encode($result);
echo json_last_error(); // <-- Here

【讨论】:

带回显 json_last_error();成功方法被启动,我有 5 作为响应。手册说它是格式错误的 UTF-8 字符,可能编码不正确,我猜是因为 ï【参考方案2】:

这对我有用: UTF-8 character encoding battles json_encode()

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);

我在这里找到了其他答案How to json_encode array with french accents?,但不断收到通知,发现非法字符。

【讨论】:

以上是关于json_encode 不适用于 PDO 获取的数据的主要内容,如果未能解决你的问题,请参考以下文章

lastInsertId() 在插入操作中不适用于 PDO 对象[关闭]

PDO 案例存在不适用于绑定参数

Php pdo rollBack() 不适用于更新语句

为啥这种“嵌套连接”适用于 PDO 而不适用于 MySql cli?

PHP json_encode 和 utf8_encode 不适用于我的 php 文件

PDO 的 rowCount() 不适用于 PHP 5.2.6+