PHP и инкапсуляция строк MySQL в массив JSON

#php #mysql #sql #json

#php #mysql #sql #json

Вопрос:

Я играю с идеей гостевой книги / чата и настраиваю таблицу MySQL с тремя столбцами:

1 — id — автоматическое увеличение первичного ключа

2 — name — Строка

3 — строка комментария

У меня очень мало опыта работы с PHP, но это то, что я собрал для этой операции:

 $result = mysql_query("SELECT * FROM guestbook");
$i = 0;
while($row = mysql_fetch_array($result))
  {
      //add the row to the $chat array at specific index of $i
      $chat[$i] = $row;
      $i  = 1;
  }

$encode = json_encode($chat);
echo "$encode";
  

Однако вывод из этого выглядит довольно ужасно:

 [{"0":"1","id":"1","1":"Justin ","name":"Justin ","2":"Comment 1","comment":"Comment 1"},
{"0":"2","id":"2","1":"Justin ","name":"Justin ","2":"Another comment","comment":"Another comment"},
{"0":"3","id":"3","1":"Justin ","name":"Justin ","2":"Look at this comment!","comment":"Look at this comment!"},
{"0":"4","id":"4","1":"Justin ","name":"Justin ","2":"Ok I'm done talking","comment":"Ok I'm done talking"}]
  

Я надеялся получить три поля: id, name и comment, но, похоже, все удвоилось. Кто-нибудь может помочь?

Спасибо!

Ответ №1:

Перефразируя Marc, просто замените эту строку:

while($row = mysql_fetch_array($result))

С помощью этого:

while($row = mysql_fetch_array($result, MYSQL_ASSOC))

Чтобы получить более чистый JSON. По умолчанию mysql_fetch_array() возвращается как целочисленный индекс, так и ассоциативный индекс, вам нужен только ассоциативный индекс.

Ответ №2:

mysql_fetch_array возвращает составной массив: индексированный И с ключом. Чтобы получить только один или другой, используйте mysql_fetch_row() (только индексированный), mysql_fetch_assoc() (только с ключом) или используйте дополнительный аргумент в fetch_array, чтобы указать, какой вы хотите: mysql_fetch_array($result, MYSQL_BOTH);

Комментарии:

1. так что правильным ответом было бы просто json_encode($result); , потому что я попробовал это, и он просто повторил «null».

2. Нет, правильным ответом было бы использовать mysql_fetch_assoc() в вашем цикле while(), затем json_encode $chat как обычно. Это приведет к созданию ТОЛЬКО именованных пар id / name / comment ключ: значение в данных JSON.

3. Я не понимаю, можете ли вы скопировать / вставить мой код и вставить синтаксис, который вы описываете? Меня беспокоит, что помещается в круглые скобки в mysql_fetch_assoc(), и должен ли я все еще добавлять в $chat[$i] .