Почему отзывы загружаются по оценкам, но если нажать на "загрузить ещё", то пишет ничего не найдено?
Я делаю ajax запрос на функцию в php, которая отправляет мне обратно html код отзывов из БД.
Я либо отправлю оценку и мне нужно вернуть первые отзывы по этой оценке (с 0 до 5) или нажать на "загрузить ещё" и вернуть следующие 5 отзывов по этой оценке.
У меня работает либо первое, либо второе. Проблема кроется в цикле while, а именно в $count.
Покажу на примере кода:
Когда страница загружается: start = 0; end = 5; star = '5';
// Нажимаю на оценку в рейтинг бар, обнуляю счетчики и показываю первые отзывы с этой оценкой
$('.body_sticky_sorts_review input').forEach((e) => {
e.addEventListener('click', () => {
start = 0; end = 5; // Обнуляю счетчики
star = e.parentNode.querySelector('p').innerHTML.split(' ')[0]; // Это оценка, например 3
load_reviews($('.body_sticky_sorts_review')); // Аргумент, это куда вешать прелодер
});
});
Это я делаю, когда хочу загрузить следующие 5 отзывов той же оценки (оценка хранится в star)
$('.moreReviews button').onclick = (e) => {
start = start + 5;
end = end + 5;
load_reviews(e.target);
}
Функция отправки запроса на php
function load_reviews(loader){
fm = new FormData();
fm.append('start', start);
fm.append('star', star);
fm.append('end', end);
ajax(loader, fm, 'assets/page-load.php', 'post', () => {
if(JSON.parse(xml.response).text_reviews == ''){
notification('Отзывы с оценкой ' + star + ' закончились');
start = start - 5; // Возвращаю счетчик обратно
end = end - 5; // Возвращаю счетчик обратно
return;
}
$('.ajax_reviews').innerHTML = JSON.parse(xml.response).text_reviews; // Вывожу код
});
}
Сама функция в php
$reviews = $db->query("SELECT * FROM reviews ORDER BY date DESC");
while($review = mysqli_fetch_array($reviews)){
if($review['conf'] == '-' and $review['star'] == $star and $count >= $start and $count < $end){
$json['text_reviews'] .= '
<div class="review">
<div class="short_nameService"><div class="layout_icon"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><p>' . ($countReview + 1) . '</p></div></div>
<div class="about_review"><div class="head_review"><p class="numb_client">' . hide_review_number($review['numb']) . '</p><p class="date_client">' . $review['date'] . '</p></div><p class="body_review">' . $review['text'] . '</p><div class="foot_review"><span class="stars_service_ex">' . return_ceil_stars($review['star']) . '</span><p>Экскурсия</p></div></div>
</div>';
$countReview++;
}
$count++; // Сам счетчик
if($count > $end){
break; // Остановить если счетчик больше $end т.к искать дальше нет смысла
}
}
Магия заключается в том, что все работает, но на половину. Если $count находится за пределами if, тогда отзывы возвращаются по оценке, но не работает "загрузить еще" и наоборот, если $count находится внутри if, тогда отзывы не возвращаются, но если кликнуть на "загрузить еще", тогда отзывы вернуться.
Ответы (1 шт):
Если $end всегда равен 5, а $start всегда показывает +5 записей после последних выбранных, то нужно отредактировать сам SQL-запрос:
установить условие выборки WHERE
установить LIMIT и OFFSET;
удалить проверку if и счётчики из цикла
$reviews = $db->query("SELECT * FROM reviews WHERE conf='-' AND star='$star' ORDER BY date DESC LIMIT $start, $end");
Потому что сейчас запрос выбирает все записи из БД. Когда их суммарный размер превысит memory_limit, скрипт начнёт выпадать в фатал эррор Allowed memory size
$end - LIMIT - всегда должен быть 5
$start - OFFSET - должен быть +5 после каждого ajax-запроса