2011-12-11 20 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