Почему отзывы загружаются по оценкам, но если нажать на "загрузить ещё", то пишет ничего не найдено?

Я делаю 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 шт):

Автор решения: Key

Если $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-запроса

→ Ссылка