【问题标题】:MYSQL table with JSON only returns first record带有 JSON 的 MYSQL 表只返回第一条记录
【发布时间】:2017-11-03 11:10:28
【问题描述】:

我有一个 MYSQL 表,其中包含一个“项目”列,我正在存储一个 JSON 对象。出于某种奇怪的原因,只返回了第一条记录。例如:我是根据“owner_id”获取的,无论第一条记录的 owner_id 是什么(1、6、9、263 ......无论如何),它总是只返回第一条记录。但是,如果此 owner_id 在此表中有其他“项目”,它们也会被返回。奇怪。

表格示例:

id:  |  owner_id:  |  items:
----------------------------------
1    |  1          |  {
                         "items": [{
                            "q": "1",
                            "d": "I'd rather be a bird than a fish.",
                            "u": "637.30"
                         },
                         {
                            "q": "6",
                            "d": "Christmas is coming.",
                            "u": "844.57"
                          }
                         ]
                       }
----------------------------------
2    |  11         |   {
                         "items": [{
                            "q": "4",
                            "d": "I often see the time 12:34.",
                            "u": "85.85"
                         },
                         {
                            "q": "6",
                            "d": "Wow, does that work?",
                            "u": "286.27"
                          }
                         ]
                       }

如果我删除了 items 列,那么我可以毫无问题地检索任何记录请求。

应该注意我正在使用 Slim 来发出数据库请求。 这是请求/查询的代码:

$app->get('/api/items/{id}', function(Request $request, Response $response){
   $id = $request->getAttribute('id');
   $sql = "SELECT * FROM items WHERE owner_id = $id";

   try{

      $db = new db();
      $db = $db->connect();

      $stmt = $db->query($sql);
      $invoices = $stmt->fetchAll(PDO::FETCH_OBJ);
      $db = NULL;

      echo json_encode($invoices);

   } catch(PDOException $e){

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

   }
});

知道发生了什么,为什么我无法获取表中的其他记录?

谢谢,

-S

【问题讨论】:

  • 这是一个拼写错误,还是您的数据库列真的称为 owner_Id 并带有大写 I 而您的 sql 查询指定 owner_id 带有小写 i?
  • 仅供参考:您容易受到 SQL 注入攻击。请改用准备好的语句。
  • @miknik 错字...应该是 owner_id。
  • @Ivar 是的,我知道这一点。感谢您的关心。
  • 为了测试,您是否尝试从 fetchAll 中省略 PDO::FETCH_OBJ 并查看它返回的内容?

标签: php mysql json slim


【解决方案1】:

上述解决方案不起作用,因为您请求的是单个 mysql 列,而 json id 与 mysql 无关。

我根据您的需要对其进行了修改

$db = new db();
$db = $db->connect();

$stmt = $db->query($sql);
$invoices = $stmt->fetchAll(PDO::FETCH_OBJ);
$db = NULL;

// to get individual json
// loop through 
// assuming you want the first data 
$arr = json_decode($invoices[0]->items);



// all single data
echo json_encode($arr);

// or get single
$id = 6; // can be added dynamically

$json = '';
foreach($arr as $i => $val){
    if($val['items']['q'] === $id){
        $json =  json_encode($val);
    }
}

// individual json
echo json_encode($json);

【讨论】:

  • 我不确定我是否理解您的建议。如果我在“项目”行中键入任何其他内容,例如 Lorem,它就会毫无问题地为我检索数据。如果我删除“项目”列,同样的交易。为什么当行被 JSON 对象填充时会这样?我不需要在 php 文件中呈现输出...我正在从另一个应用程序中检索数据,但是使用 POSTMAN 或类似的东西发出请求仅适用于第一条记录和所有匹配的 owner_ids
  • 如果我理解正确,`$invoices` 是数据库结果中的变量,它包含sql 表中的所有代码记录。
  • 是的,没错。它保存使用 {id} 获取的数据,即 owner_id,用于该特定所有者。这意味着 owner_id #1 可以有 10 行数据,并且它们可以正常检索,但是 owner_id #2 有 3 行数据,并且在运行 '/api/items/2' 时什么都没有检索到。
【解决方案2】:

感谢大家的时间和努力。最后,这是我的一个愚蠢的错误......我在“项目”字段中的省略号和撇号有一些特殊的 html 字符,这导致了某种故障。

【讨论】:

    猜你喜欢
    • 2018-09-13
    • 1970-01-01
    • 1970-01-01
    • 2015-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多