Как правильно сделать пагинацию?

У меня есть база данных где находятся проекты, и есть на странице навигация по этим проектам с помощью двух кнопок "Вперед" и "Назад"

<?php
$nextpost = next_post($post_id);
$prevpost = prev_post($post_id);
?>


<div>
<a href="/project?post_id=<?= $prevpost['id'] ?>"><button>Prev</button></a>
<a href="/project?post_id=<?= $nextpost['id'] ?>"><button">Next</button></a>
</div>


function next_post($post_id)
{
    global $link;
    $sql = "SELECT * FROM projects WHERE id > " . $post_id . " ORDER BY id ASC LIMIT 1";
    $result = mysqli_query($link, $sql);
    $nextpost = mysqli_fetch_assoc($result);
    return $nextpost;
}

function prev_post($post_id)
{
    global $link;
    $sql = "SELECT * FROM projects WHERE id < " . $post_id . " ORDER BY id DESC LIMIT 1";
    $result = mysqli_query($link, $sql);
    $prevpost = mysqli_fetch_assoc($result);
    return $prevpost;
}


Проблема в том что, если я, например, нахожусь на проекте с id=5id=6 еще нет) и при этом я нажимаю на кнопку "Вперед", то меня переносит на страницу с id=6, которой не существует и я просто получаю ошибку.

Как сделать так, чтобы при настику на кнопку "Вперед", при условии что у меня нет следующего проекта, меня перекидувало на страницу с id самого первого проекта в базе данных. (Так же и с кнопкой "Назад")
  • Вопрос задан
  • 69 просмотров
Пригласить эксперта
Ответы на вопрос 2
DmitriyEntelis
@DmitriyEntelis
Думаю за деньги
Из приведенного кода не понятно как происходит
если я, например, нахожусь на проекте с id=5 (а id=6 еще нет) и при этом я нажимаю на кнопку "Вперед", то меня переносит на страницу с id=6, которой не существует и я просто получаю ошибку.


Общая идея пагинации: смотрите какие у вас есть данные в базе, исходя из этого формируете ссылки на возможные страницы.
Если вы хотите сделать цикличную - ну так и сделайте её, добавьте в свою логику проверку "id больше чем текущий не найдено" и корректно обрабатывайте.
Ответ написан
Комментировать
Да простят меня боги чистого кода.

/**
 * Следующий пост
 *
 * @param $post_id
 *
 * @return string[]|null
 */
function next_post($post_id)
{
    global $link;
    $sql      = "SELECT * FROM projects WHERE id > " . $post_id . " ORDER BY id ASC LIMIT 1";
    $result   = mysqli_query($link, $sql);
    $nextpost = mysqli_fetch_assoc($result);

    if (!$nextpost) {
        return first_post();
    }

    return $nextpost;
}

/**
 * Предыдущий пост
 *
 * @param $post_id
 *
 * @return string[]|null
 */
function prev_post($post_id)
{
    global $link;
    $sql      = "SELECT * FROM projects WHERE id < " . $post_id . " ORDER BY id DESC LIMIT 1";
    $result   = mysqli_query($link, $sql);
    $prevpost = mysqli_fetch_assoc($result);

    if (!$prevpost) {
        return last_post();
    }

    return $prevpost;
}

/**
 * Первый пост
 *
 * @return string[]|null
 */
function first_post()
{
    global $link;
    $sql    = "SELECT * FROM projects WHERE ORDER BY id ASC LIMIT 1";
    $result = mysqli_query($link, $sql);
    $post   = mysqli_fetch_assoc($result);

    return $post;
}

/**
 * Последний пост
 *
 * @return string[]|null
 */
function last_post()
{
    global $link;
    $sql    = "SELECT * FROM projects WHERE ORDER BY id DESC LIMIT 1";
    $result = mysqli_query($link, $sql);
    $post   = mysqli_fetch_assoc($result);

    return $post;
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы