【问题标题】:PHP PDO fetchAll then json_encode doesn't workPHP PDO fetchAll 然后 json_encode 不起作用
【发布时间】:2015-03-31 20:22:45
【问题描述】:

我有一个奇怪的问题。我有一个简单的 PHP 脚本,它使用 PDO 从数据库中获取所有国家/地区,然后将结果作为 json 返回。当我使用 fetch 函数而不是 fetchAll 时,一切都按预期工作。当我 print_r 时,数据就在那里。

不起作用:

 $sql = "SELECT * FROM countries";
if($stmt = $_db->prepare($sql))
{
    $stmt->execute();
    $data = $stmt->fetchAll(PDO::FETCH_ASSOC);
    $stmt->closeCursor();

    header("content-type:application/json");

    echo json_encode($data);
    exit();

}

作品:

 $sql = "SELECT * FROM countries";
if($stmt = $_db->prepare($sql))
{
    $stmt->execute();
    $data = $stmt->fetch(PDO::FETCH_ASSOC);
    $stmt->closeCursor();

    header("content-type:application/json");

    echo json_encode($data);
    exit();

}

print_r 的结果:

Array
(
[0] => Array
    (
        [id] => 1
        [name] => Afghanistan
    )

[1] => Array
    (
        [id] => 2
        [name] => Åland Islands
    )

[2] => Array
    (
        [id] => 3
        [name] => Albania
    )
....
[248] => Array
    (
        [id] => 249
        [name] => Zimbabwe
    )

)
1

【问题讨论】:

  • 第一个代码是做什么的? print_r 来自哪段代码?两者都一样吗?
  • fetch() 应该只返回下一个结果行...
  • 如您所见,fetch() 和 fetchAll() 返回不同的数据集。很难说出你在问什么。
  • 我的问题应该更清楚。我知道 fetch 返回下一行,当我使用 json_encode 并返回数据时,这非常有效。我得到 json 格式的下一行。问题是当我使用 fetchAll 从数据库中获取所有国家/地区时。我可以使用 print_r 查看查询结果,一切都按预期进行,但是当我使用 json_encode 时,我得到一个空白屏幕。这对我来说毫无意义。

标签: php json


【解决方案1】:

试试

$dbh = new PDO("mysql:host=$dbhost;dbname=$dbname", $dbuser, $dbpass, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));

与:

array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")

【讨论】:

  • 我正在使用新的 PDO('firebird:dbname='.$dados_sql['ip'].':'.$dados_sql['alias'].';charset=utf8',$pwEuser[ 'pw'], $pwEuser['user']);和 FECH_ASSOC,而不是 FETCH_OBJ
【解决方案2】:

当你遇到JSON问题时,有一个函数json_error()

得知编码有问题后,告诉你的数据库返回utf8中的数据:

$_db->query("SET NAMES utf8");
$data = $_db->query("SELECT * FROM countries")->fetchAll(PDO::FETCH_ASSOC);

header("content-type:application/json");
echo json_encode($data);
exit();

【讨论】:

    【解决方案3】:

    尝试像这样在 PDO 初始化时设置字符集

    $_db = new PDO("mysql:host=$host;dbname=$dbname;charset=UTF8;", $dbuser, $dbpass);
    

    注意上面第一个参数charset=UTF8;的结尾

    【讨论】:

      【解决方案4】:

      fetchall 文档说同时检索所有 fetch 数据的数组。在这种情况下,您的 fetchall 函数似乎将结果数组分配到了数组列表中。

      下面是参考链接,

      PDO fetch / fetchAll

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-06-16
        • 1970-01-01
        • 2013-02-05
        • 1970-01-01
        • 2016-04-16
        • 2018-11-14
        • 2014-11-05
        • 1970-01-01
        相关资源
        最近更新 更多