Я работаю с javascript для извлечения данных из базы данных с помощью ajax. Текст ответа следующий:
{"task":"r","category":"s","duration":"0"}{"task":"read","category":"s","duration":"10"}{"task":"read","category":"o","duration":"10"}
Я использовал json_encode($data) в скрипте php, который извлекает данные из базы данных MySql. Как мне сохранить задачу, категорию и продолжительность текста ответа в отдельных переменных. Я не могу использовать полученный ответ. Вот код:
if (mysqli_query($conn,$query)){
$result = mysqli_query($conn,$query);
$tasks = mysqli_fetch_all($result,MYSQLI_ASSOC);
foreach($tasks as $task){
echo json_encode($task);
}
mysqli_free_result($result);
}
get(url){
let xhr = new XMLHttpRequest();
xhr.open('GET',url,true)
xhr.onload= function(){
if (this.status===200){
let data = this.responseText;
console.info(data);
}
}
xhr.send();
}Опубликованный код содержит несколько файлов json. Он должен выглядеть как {[content_of_first_bracked, content_of_second_bracked, ...]}, или вам нужно добавить текст / знак разделителя и разделить внутри javascript, а затем jsondecode каждую часть
Да, я использовал эхо в цикле. Что я должен использовать вместо этого, чтобы получить правильный ответ в скрипте php?
Вы должны поместить все результаты в массив, а затем закодировать этот массив после завершения цикла.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Попробуйте объявить тип полученных данных type с помощью dataType: "json"
Как это:
$.ajax({
type: "POST",
url:"php/page.php",
dataType:"json",
success: function(data)
{
console.info(data);
},
error:function (data) {
console.info("Error"+data)}
});Также ваши данные должны быть одним массивом json, а не несколькими объектами json.
Попробуй это:
$array = new Array();
$ c = 0;
while(condition){
$array[$c] = your_c_object
$c++;
}
echo json_encode($array);
У вас должен быть такой вывод в console.info
[{"task":"r","category":"s","duration":"0"},
{"task":"read","category":"s","duration":"10"},
{"task":"read","category":"o","duration":"10"}]
В переменной $c нет необходимости. Просто используйте $array[] =, чтобы протолкнуть массив.
Как упоминалось в вопросе, ваш ответ не в правильном формате JSON. Ваш ответ имеет формат:
{"task":"r","category":"s","duration":"0"}{"task":"read","category":"s","duration":"10"}{"task":"read","category":"o","duration":"10"}
Принимая во внимание, что действительный ответ JSON должен быть в формате
[{"task":"r","category":"s","duration":"0"},{"task":"read","category":"s","duration":"10"},{"task":"read","category":"o","duration":"10"}]
Как только это будет в правильном формате, декодируйте JSON с помощью функции json_decode и используйте ответ в цикле.
См. Пример ниже для правильного декодирования:
$str = '[{"task":"r","category":"s","duration":"0"},{"task":"read","category":"s","duration":"10"},{"task":"read","category":"o","duration":"10"}]';
$response = json_decode($str, true);
foreach ($response as $res) {
echo $res['task'] . ' ==== ' . $res['category'] . ' ===== ' . $res['duration'];
}
Надеюсь это поможет.
я предполагаю, что вы вызываете
echoв цикле. Может быть только одинechoдля всего запроса JSON. Поместите все строки в основной массив и повторите это. Также предоставьте минимальный воспроизводимый пример, если вам нужна дополнительная помощь