【问题标题】:How can I stop json_encode() encoding twice?如何停止 json_encode() 编码两次?
【发布时间】:2012-07-18 09:06:24
【问题描述】:
$file_db = new PDO('sqlite:test.db');
if($file_db){
    $result = $file_db->query('SELECT id FROM sample');
    $encodable = array();
    while($obj = $result->fetch())
    {
        $encodable[] = $obj;
    }

    $encoded = json_encode($encodable);
    echo $encoded;
}else{
    die("unable to conenct to db");
}

我只想输出{"id":"1"},但它也给了我"0":"1"。有谁知道为什么?

结果:

[{"id":"1","0":"1"},{"id":"2","0":"2"},{"id":"3","0":"3"},{"id":"4","0":"4"},{"id":"5","0":"5"},{"id":"6","0":"6"},{"id":"7","0":"7"},{"id":"8","0":"8"},{"id":"9","0":"9"},{"id":"10","0":"10"},{"id":"11","0":"11"},{"id":"12","0":"12"},{"id":"13","0":"13"},{"id":"14","0":"14"}]

【问题讨论】:

  • 因为你搞砸了你的数据库处理。
  • 你查看$obj的内容了吗?

标签: php pdo json


【解决方案1】:

是因为您使用 PDO 获取数据的方式。 PDOStatement::fetch 使您可以选择是否需要关联数组、索引数组等。默认是两者都有。将其更改为具有您期望的行为:

while($obj = $result->fetch(PDO::FETCH_ASSOC))

【讨论】:

  • 此外,如果可以使用$encodable = $result->fetchAll(PDO::FETCH_ASSOC);,为什么还要使用while($obj = $result->fetch(PDO::FETCH_ASSOC)),那里根本不需要while
  • 我听说使用fetchAll 实际上比使用while($row = $stmt->fetch(PDO::FETCH_ASSOC)) 循环要慢。但是找不到源atm。 while 允许您仔细检查结果,或立即处理它们。所以有必要获取单个结果集
【解决方案2】:

从数据库返回的$encodable 包含所有值的索引(数字)和键(列名)。所以它给一次键和一次索引。

您可以遍历结果并将所需的值推送到数组中。然后对其进行编码。

【讨论】:

    【解决方案3】:

    尝试更改此行

    while($obj = $result->fetch())
    

    while($obj = $result->fetch(PDO::FETCH_ASSOC))
    

    来自 fetch() 常量的 php 文档
    控制如何将下一行返回给调用者。此值必须是 PDO::FETCH_* 常量之一,默认为 PDO::FETCH_BOTH。


    PDO::FETCH_ASSOC: 返回一个按您的结果集中返回的列名索引的数组

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-07
      • 2022-01-13
      • 1970-01-01
      • 1970-01-01
      • 2013-06-08
      • 2019-03-20
      相关资源
      最近更新 更多