2011-12-11 27 views
0

我有这样的代码编码一个完美的JSON

$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个记录......没有人如何解决这个问题?

+0

该mysql扩展已过时,并在其弃用的方式。新代码应该使用mysqli或PDO,它们都具有重要的优点,例如支持预处理语句。不要使用['SELECT *'](http://stackoverflow.com/questions/321299);只选择你需要的列。 – outis

+0

您将在每次迭代中重置$ data_row。所有你需要做的就是将所有的行存储到一个数组中,并且'json_encode($ final_array)' – Broncha

回答

-2

您需要封装你行的记录,像{ROW1:{A:B,B:C},2行:{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

+0

完美答案.. :)非常感谢你.... :) –

+0

一个对象数组应该封装在[]中。正如@ user1083183回答的最终输出应该是'[{id:1,title:'title'},{id:2,title:'title2'}]' – Broncha

+0

OP也不会要求数组对象,也不会请参阅user1083183的答案...错误的主题? – kontur

5

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

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

+0

它现在可以工作,但是我看不到每个数据之间的“,”... –

+0

只需在每次传递中添加一个逗号。但是,您需要确保不要将逗号添加到最后一条记录;尾随逗号在某些浏览器中引发问题。 – canon

+0

!yeahh了我的意思是每个阵列 '{ “ID”: “1”, “名”: “我” }, { “ID”: “2”, “名”: “你” } 我没有逗号显示..之间'{},{}' –

1

您正在循环浏览数据,并将$data_row设置为每行的新数组,但在退出循环之前您没有执行任何操作。

+0

我明白了,兄弟:)谢谢,但每个数组之间的逗号。>? –

+0

@HannibalBurr - 在第一次循环之后,只需在打印下一个数组之前打印一个逗号。您可以在循环前设置一个标志来指示第一次通过并在打印后每次清除它。 –

-1

的代码示例只打印$data_row循环完成之后,在该点$data_row保持最后的R从结果来看。您需要将行收集到数据结构中,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) { 
    ... 
+0

啊,开车吧。 – outis

1

为什么要显示所有行或使用{}包装过于复杂?只是让$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 
    )) 
+0

这是一个正确的答案。 – Broncha