【问题标题】:encode a perfect json编码一个完美的json
【发布时间】:2011-12-11 07:36:26
【问题描述】:

我有这个代码

$md_query = "SELECT * FROM table ORDER BY id ASC";
$md_result = mysql_query($md_query, $con);

header('Cache-Control: no-cache, must-revalidate');
header('Content-type: application/json');

while($md_row=mysql_fetch_array($md_result))
    $data_row = array(
        'id' => $md_row['id'],
        'type' => $md_row['type'],
        'title' => $md_row['title'],
        'content' => $md_row['content'],
        'author' => $md_row['postedby'],
        'post_date' => $md_row['posteddate'],
        'publish' => $md_row['publish']
    );

print json_encode($data_row); `

但我只显示 1 条记录...有人如何解决这个问题?

【问题讨论】:

  • mysql 扩展已过时,即将弃用。新代码应该使用 mysqli 或 PDO,两者都有重要的优势,例如支持准备好的语句。不要使用SELECT *;只选择您需要的列。
  • 您在每次迭代中都重置 $data_row。您需要做的就是将所有行存储到一个数组和json_encode($final_array)

标签: php mysql arrays json


【解决方案1】:

您的 while 循环不包括 print 语句...因此,它循环遍历所有记录,每次完全重置 $data_row,然后在完成后打印一次。

要包含多个语句,您需要使用{} 来封装块。

【讨论】:

  • 只需在每次传递时添加一个逗号。但是,您需要确保不要在最后一条记录中添加逗号;尾随逗号会导致某些浏览器出现问题。
  • !是的,我的意思是每个数组{ "id":"1", "name":"me" }, { "id":"2", "name":"you" } 我没有逗号显示.. 在{},{}
【解决方案2】:

您正在循环您的数据并将$data_row 设置为每一行的新数组,但在退出循环之前您不会对其进行任何操作。

【讨论】:

  • @HannibalBurr - 在第一次循环之后,在打印下一个数组之前打印一个逗号。您可以在循环之前设置一个标志以指示第一次通过并在每次打印后清除它。
【解决方案3】:

为什么显示所有行或用 {} 换行变得过于复杂?只需将$data_row 设为一个多维数组,json_encode() 就会使用 []:

while($md_row=mysql_fetch_array($md_result))
$data_row[] = array(   // please note I added [] !
    'id' => $md_row['id']
    ,'type' => $md_row['type']
);

print json_encode($data_row);

打印例如:

[{"id":"3","type":"One"},{"id":"8","type":"Two"},{"id":"9","type":"Three"},{"id":"10","type":"Four"}]

如果您将该 JSON 字符串转换回数组,则如下所示:

Array(
[0] => Array
    (
        [id] => 3
        [type] => One
    )

[1] => Array
    (
        [id] => 8
        [type] => Two
    )

[2] => Array
    (
        [id] => 9
        [type] => Three
    )

[3] => Array
    (
        [id] => 10
        [type] => Four
    ))

【讨论】:

    【解决方案4】:

    代码示例仅在循环完成后打印$data_row,此时$data_row 保存结果的最后一行。您需要将行收集到数据结构中,进行 JSON 编码并打印出来,或者在循环的每次迭代中打印每一行。

    ...
    header('Cache-Control: no-cache, must-revalidate');
    header('Content-type: application/json');
    
    $md_query = $db->prepare(
        "SELECT id, type, title, content, postedby AS author, 
                posteddate AS post_date, publish
           FROM posts 
           ORDER BY id ASC");
    
    try {
        $md_query->execute();
        echo json_encode($md_query->fetchAll(PDO::FETCH_ASSOC));
    } catch (PDOException $exc) {
        ...
    }
    

    请注意,由于这会从表中获取所有行,因此可能会耗尽脚本的最大允许内存或运行时间。如果内存限制有问题,请更改负责显示结果的代码行,以便一次打印一个块。例如:

        ...
        $md_query->setFetchMode(PDO::FETCH_ASSOC);
    
        echo '[';
        $last = $md_query->rowCount()-1;
        foreach ($md_query as $i => $post) {
            echo json_encode($post);
            if ($i < $last) {
                echo ", ";
            }
        }
        echo ']';
    } catch (PDOException $exc) {
        ...
    

    【讨论】:

      【解决方案5】:

      您需要封装行记录,例如 {row1: {a:b, b:c}, row2:{e:f, g:h}}

      $json = '{';
      while($md_row=mysql_fetch_array($md_result)) {
      $data_row = array(
          'id' => $md_row['id'],
          'type' => $md_row['type'],
          'title' => $md_row['title'],
          'content' => $md_row['content'],
          'author' => $md_row['postedby'],
          'post_date' => $md_row['posteddate'],
          'publish' => $md_row['publish']
      );
      $json .= '"' . $id . '" :' . json_encode($data_row) . ','; 
      // $id just as an example for the string-value pair
      }
      $json = substr($json, 0, -1); // remove comma after last row
      $json .= '}';
      echo $json;
      

      更多示例参见:

      http://json.org/

      http://json.org/example.html

      【讨论】:

      • 对象数组应该封装在[]中。正如@user1083183 回答的那样,最终输出应该是[{id:1,title:'title'},{id:2,title:'title2'}]
      • OP 也没有要求对象数组,我也没有看到 user1083183 的答案......主题错误?
      猜你喜欢
      • 2016-12-06
      • 1970-01-01
      • 2017-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-04
      • 2015-08-26
      相关资源
      最近更新 更多