2014-09-26 81 views
0

我在PHP中編寫了一個腳本,該腳本從MySQL數據庫獲取值並將值輸出爲JSON。但是,我遇到了問題。下面的代碼:PHP回聲破壞

<?php 
    mysql_connect("localhost", "root", ""); 
    mysql_select_db("stitchdex"); 
    $query = mysql_query("SELECT image, price, description FROM {$_GET['table']}"); 
    $jsonString = "{\"images\":["; 
    $numrows = mysql_num_rows($query); 
    $i=0; 
    while ($row = mysql_fetch_array($query)) { 
     $jsonString .= "{\"image\":\"{$row['image']}\", \"price\":\"{$row['price']}\", \"description\":\"{$row['description']}\"}"; 
     if (($numrows-1) == $i) echo ""; 
     else echo ","; 
     $i++; 
    } 
    $jsonString .= "]}"; 
    echo $jsonString; 
?> 

但它輸出:

,,,,,,,,,,,,,,,,,{"images":[{"image":"priceguide1.jpg", "price":"", "description":"Diagram of Options"}{"image":"2ndamendfront.jpg", "price":"$109.00", "description":"Total of 3 laser etchings"}{"image":"DSC_0120.jpg", "price":"$99.00", "description":"Designer Kydex 1 Laser Etching"}{"image":"DSC_0121.jpg", "price":"", "description":"Lazer Etching on Back"}{"image":"gilbert.jpg", "price":"$109.00", "description":"Designer Kydex 2 Lazer Etchings"}{"image":"glock23-carbonfiber-red1.jpg", "price":"$79.00", "description":""}{"image":"irish1.jpg", "price":"$129.00", "description":"Designer Kydex Two Tone Leather & 3 Laser Etchings Two on front One on Back"}{"image":"irish2.jpg", "price":"$129.00", "description":"Designer Kydex Two Tone Leather & 3 Laser Etchings Two on front One on Back"}{"image":"klover-glock-2.jpg", "price":"$129.00", "description":"Designer Kydex Two Tone Leather & 3 Laser Etchings Two on front One on Back"}{"image":"priceguide1.jpg", "price":"", "description":"Diagram of Options"}{"image":"2ndamendfront.jpg", "price":"$109.00", "description":"Total of 3 laser etchings"}{"image":"DSC_0120.jpg", "price":"$99.00", "description":"Designer Kydex 1 Laser Etching"}{"image":"DSC_0121.jpg", "price":"", "description":"Lazer Etching on Back"}{"image":"gilbert.jpg", "price":"$109.00", "description":"Designer Kydex 2 Lazer Etchings"}{"image":"glock23-carbonfiber-red1.jpg", "price":"$79.00", "description":""}{"image":"irish1.jpg", "price":"$129.00", "description":"Designer Kydex Two Tone Leather & 3 Laser Etchings Two on front One on Back"}{"image":"irish2.jpg", "price":"$129.00", "description":"Designer Kydex Two Tone Leather & 3 Laser Etchings Two on front One on Back"}{"image":"klover-glock-2.jpg", "price":"$129.00", "description":"Designer Kydex Two Tone Leather & 3 Laser Etchings Two on front One on Back"}]} 

這將是有效的JSON如果逗號分隔的「圖像」數組中的對象,但由於某些原因腳本輸出所有的逗號先。爲什麼是這樣?

回答

3

我建議不要手動建立json字符串,使用json_encode(),這就是爲什麼它出於這個原因。

$data = array(); 
while ($row = mysql_fetch_assoc($query)) { 
    $data[] = $row; 
} 

echo json_encode(array('images' => $data)); 

旁註:另外,使用改進的擴展名爲mysqli或PDO,並使用預準備語句。您現在的代碼直接在查詢中使用$_GET變量,並且容易受到sql注入的影響。綁定它們以產生更安全的查詢。

1

由於您使用echo循環,輸出的commans內:

<?php 
mysql_connect("localhost", "root", ""); 
mysql_select_db("stitchdex"); 
$query = mysql_query("SELECT image, price, description FROM {$_GET['table']}"); 
$jsonString = "{\"images\":["; 
$numrows = mysql_num_rows($query); 
$i=0; 
while ($row = mysql_fetch_array($query)) { 
    $jsonString .= "{\"image\":\"{$row['image']}\", \"price\":\"{$row['price']}\", \"description\":\"{$row['description']}\"}"; 
    if (($numrows-1) == $i) echo ""; //<--- echo empty string? why? 
    else echo ","; //<--- HERE YOU ECHO THE COMMAS 
    $i++; 
} 
$jsonString .= "]}"; 
echo $jsonString; //<--- AND THEN HERE YOU ECHO EVERYTHING ELSE 
?> 

它們串聯到$jsonString代替。


試試這個代碼:

while ($row = mysql_fetch_array($query)) 
{ 
    $jsonString .= "{\"image\":\"{$row['image']}\", \"price\":\"{$row['price']}\", \"description\":\"{$row['description']}\"}"; 
    if (($numrows-1) != $i) 
    { 
     $jsonString .= ","; 
    } 
    $i++; 
} 
$jsonString .= "]}"; 
echo $jsonString; 

順便說mysql_ *功能已過時。


PS:我aprove Ghost's approach - 我打算這個答案是幫助你理解了什麼問題。

0

你在json字符串之前回顯逗號。 更改

else echo ","; 

$jsonString .= ", "; 
0

爲了有你想要的輸出,你可以這樣做:

$data = array(); 
while ($row = mysql_fetch_array($query)) { 
    $data[] = $row; 
} 
$arr['images'] = $data; 
echo json_encode($arr);