json_encode在PDO获取的数据上不起作用。

15 浏览
0 Comments

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格式。感谢任何帮助。

0
0 Comments

问题的出现原因是编码问题。可以通过使用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数据了。

0
0 Comments

问题出现的原因是在使用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编码的数据。

0