2014-09-26 46 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);