Как корректно вывести данные получены от сервера.
Есть небольшой MVC-апликейшн.
Вот модель:
public function getComments()
{
$db = Db::getInstance();
$res = $db->prepare("SELECT * FROM comments LEFT JOIN users ON (comments.login_id = users.id) ORDER BY comments.id DESC LIMIT 10");
$res->execute();
$rez = $res->fetchAll();
return $rez;
}
Вот контроллер:
public function action_getajax()
{
$this->model = new Model_Comments();
$data[2] = $this->model->getComments();
echo json_encode($data[2]);
}
И вот пытаюсь на главной вывести все комментарии посредством js,jquery+ajax:
$(function() {
var ids = [];
setInterval(function() {
myAjax();
}, 3000
);
function myAjax() {
$.ajax({
url: '/comments/getajax',
cahche: false,
type: 'GET',
dataType: 'json',
contentType: 'application/json; charset=utf-8',
beforeSend: function() {
$('#myajax').html('Loading...');
},
success: function(data) {
$('#myajax').hide();
$.each(data, function(i, val) {
if($.inArray(val.id, ids) == -1) {
ids.push(val.id);
$('#comments').prepend("<div class=\"panel panel-default\"><div class=\"panel-heading\"><b class=\"panel-title\"><b>" + val.login_id + " / " + val.date + "</div><div class=\"panel-body\">" + val.text + "</div></div>");
}
});
},
error: function(msg) {
$('myajax').text(msg.responseText);
},
});
};
});
Но к сожалению оно некорректно выводит, только 3 последних.
Ответ приходит в таком виде (получается в виде обьектов js):
[{"id":"2","0":"6","login_id":"2","1":"2","text":"test AJAX comments!","2":"test AJAX comments!","date":"2017-05-26 20:39:41","3":"2017-06-05 11:41:23","4":"2","login":"test","5":"test","password":"1234","6":"1234","email":"tester@net.ua","7":"tester@net.ua","8":"2017-05-26 20:39:41"}, ... ]
Сначала пытался преобразовывать ответ через JSON.parse() и JSON.stringify(), но понял, что ответ уже отформатирован и остается только вывести. Выводить пробовал по-разному, но успеха нет.
Может кто подсказать в чем проблема?
Вообщем ковырял много доков и нашел одно решение для моего случая:
setInterval(function() {
$.getJSON("/comments/getajax", function(json) {
var html = "";
json.forEach(function(val) {
var keys = Object.keys(val);
html += "<div class = 'cat'>";
keys.forEach(function(key) {
html += "<div class=\"panel panel-default\"><div class=\"panel-heading\"><b class=\"panel-title\"><b>" + val[key].login_id + "</b> / " + val[key].date + "</div><div class=\"panel-body\">" + val[key].text + "</div></div>";
// html += val[key].text + "<br>";
});
html += "</div><br>";
$('#myajax').hide();
$('#comments').html(html);
console.log(html);
});
});
}, 3000
);
Остался ещё вопрос, в модели я делал запрос с left join'ом, что бы при выводе комментов выводился не id-автора а его ник, здесь же получается никак не получиться так сделать? Нужно уже отдавать Ajax'у готовый объект?
Как развивать веб-проекты в 2026 году: технологии, контент E-E-A-T и факторы доверия
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники