0

I've been building a little tool to manage a dataset, I'm trying create a JSON output in order to serve my front-end the data.

Right now I have an extra comma at the end of every row in the loop. I need to remove it, it would be ideal if I can find a way to do this inside of the while loop.

Here is my code:

$sth = mysql_query("SELECT * FROM mapdata");
$num_rows = mysql_num_rows($sth);
$counter = 0;
echo '[';
while($r = mysql_fetch_assoc($sth)) {
    if (++$counter == $num_rows) {
        echo json_encode($r) . '';
    }
    else {
        echo json_encode($r) . ',';
    }
}
echo "]";
mysql_close($connection);

This is what I'm getting returned now

[
{"col1":"123","col2":"456","col3":"789",},
{"col1":"123","col2":"456","col3":"789",}
]

This is what I need.

[
{"col1":"data1","col2":"data2","col3":"data3"},
{"col1":"data1","col2":"data2","col3":"data3"}
]

Any suggestions would be greatly appreciated.

8
  • 1
    Why are you doing it like this? Why don't you just put everything into an array and call json_encode() on the whole thing? Commented Sep 5, 2014 at 0:32
  • I don't see where that extra comma is coming from. json_encode($r) doesn't add an extra comma like that. Commented Sep 5, 2014 at 0:34
  • @Barmar it's being appended in the else section of the statement Commented Sep 5, 2014 at 0:35
  • No it isn't. That's the comma AFTER the }, his problem is the comma BEFORE the }. Commented Sep 5, 2014 at 0:36
  • just encode after the you're done creating the array Commented Sep 5, 2014 at 0:39

2 Answers 2

6

Your whole approach is wrong, you shouldn't try to create JSON by hand. Put all the rows in an array, and let json_encode() do it all for you.

$result = array();
while ($r = mysql_fetch_assoc($sth)) {
    $result[] = $r;
}
echo json_encode($result);
Sign up to request clarification or add additional context in comments.

Comments

0

I like to follow best practice whereever possible, but in this particular instance I needed to deviate from best practice due to some environment restrictions I had. I thought I'd share the solution I ended up using, regardless of it being overly complicated.

$sth = mysql_query("SELECT name,address,address2,city,state,postal,phone,lat,lng FROM mapdata");
$num_rows = mysql_num_rows($sth);
$counter = 0;
echo '[';
while($r = mysql_fetch_assoc($sth)) {
    if (++$counter == $num_rows) {
        echo preg_replace("/^,/",'',str_replace(',}','}',json_encode($r)));

    }
    else {
        echo preg_replace("/^,/",'',str_replace(',}','}',json_encode($r)) . ',');
    }
}
echo "]";
mysql_close($connection);

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.