【问题标题】:PHP fetchAll PDO::FETCH_OBJ and json_encode returns invalid JSONPHP fetchAll PDO::FETCH_OBJ 和 json_encode 返回无效的 JSON
【发布时间】:2017-09-25 20:22:59
【问题描述】:

我尝试使用 PDO::FETCH_OBJjson_encode 从我的 MySQL 数据库中获取一些数据,但它不起作用,因为我在 MySQL 表中添加了一个 DATE 字段。

这是我的代码的样子:

$app->get('/api/teams', function(Request $request, Response $response) {
$sql = "SELECT * FROM teams";

try {
    $db = new db();

    $db = $db->connect();

    $stmt = $db->query($sql);
    $teams= $stmt->fetchAll(PDO::FETCH_OBJ);
    $db = null;
    echo json_encode($teams);

   } catch(PDOException $e) {
       echo '{"error": {"text": '.$e->getMessage().'}';
   }
});

在我添加 DATE-field 之前,它工作得非常好,它返回了一个包含一堆对象的数组。现在它根本不返回任何数据。即使,例如当我打电话给/api/teams/25 - 我收到正确的数据,即使是日期数据。因此,当我想一次接收所有团队/数据时,它“仅”失败。

谁能告诉我哪里出了问题以及如何解决?

我也可以说我尝试过这样做:

foreach($teams as $team){
    echo json_encode($team);
}

但是这返回了无效的JSON数据,是一堆没有逗号分隔的Objects

编辑

我的 DB SCHEMA 看起来像这样,

id (int(11), primary_key, auto_increment)
team ( varchar(255) )
country ( varchar(255) )
league ( varchar(255) )
creation_day ( date )

** 编辑 2 **

foreach-example 返回的无效 JSON 如下所示:

{"id":"27", "Bayern München", "country":"Germany", "league": "Bundesliga, "creation_day": "2016-10-14"} {"id":"28", "Borussia Dortmund", "country":"Germany", "league": "Bundesliga, "creation_day": "2016-10-14"}

..等等

【问题讨论】:

  • 你能发布你的架构吗?
  • @JeffPuckett 什么架构?
  • 数据库架构
  • @JeffPuckett 查看已编辑的问题/帖子
  • 你需要发布一个“坏”数据的例子,否则我们无法告诉你它有什么问题。

标签: php mysql json pdo


【解决方案1】:

问题是您发出的不是一个 JSON 文档,而是几个刚刚拼凑在一起的文档。那是无效的。只需这样做:

echo json_encode($teams);

【讨论】:

  • ehhh...但这就是我的工作?
  • 您在循环中执行此操作,您会生成 N 个 JSON 文档,而不是单个有效的 JSON 文档。通常,在生成 JSON 结果时,您只能调用一次,并且只能调用一次 json_encode,因此,如果您需要重组数据以使其在 JSON 中工作,您可以在调用之前执行此操作。在您的情况下,您似乎有一个数组,因此可以直接将其传入,无需迭代。
  • 在帖子中,我写了“我也试过了”... 'echo json_encode($teams)' 什么都不返回 - 因为我在 MySQL 表中添加了 Date-字段
  • 不清楚为什么它第一次没有工作,因为如果你的迭代器版本工作,那么它绝对应该。
  • 作为一个快速测试,尝试注释掉任何与生成 JSON 结果无关的代码,然后启用位,直到找到确切的故障。
【解决方案2】:

PDO::FETCH_OBJ:返回一个匿名对象,其属性名称对应于结果集中返回的列名称

http://php.net/manual/en/pdostatement.fetch.php

我怀疑您对PDO::FETCH_OBJ 的使用是您问题的根源。如果您只是想将整个结果输出为 JSON,我建议您将其更改为 PDO::FETCH_ASSOC

所以您的代码示例如下所示:

$app->get('/api/teams', function(Request $request, Response $response) {
$sql = "SELECT * FROM teams";

try {
    $db = new db();

    $db = $db->connect();

    $stmt = $db->query($sql);
    $teams= $stmt->fetchAll(PDO::FETCH_ASSOC); // <-- This changes
    $db = null;
    echo json_encode($teams);

   } catch(PDOException $e) {
       echo '{"error": {"text": '.$e->getMessage().'}';
   }
});

我认为这是您的问题的原因是因为 JSON 需要某种格式,因此如果您没有从您的 echo 获得任何输出,那么您的 JSON 很可能是无效的。如果你想测试,可以查看json_encode 回复的内容:

json_encode

成功返回 JSON 编码字符串,失败返回 FALSE。

http://php.net/json_encode

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-09
    • 2015-03-31
    • 2017-08-16
    • 2014-12-09
    • 1970-01-01
    • 2014-02-02
    • 2011-12-24
    相关资源
    最近更新 更多