Informacje o nowych artykułach oraz akcjach edukacyjnych prosto na Twojej skrzynce e-mail!

Paginacja (stronicowanie)

Kiedy mamy do wyświetlania dość dużą liczbę danych (rekordów), nie możemy „wypisać” ich jeden po drugim gdyż taka strona internetowa będzie bardzo długo się wczytywać, a co najważniejsze będzie ciężko po niej poruszać. W końcu nikomu nie jest przyjemnie przewijać w dół przez 20 minut okno przeglądarki, żeby dojść do ostatniego wpisu. Właśnie tutaj z rozwiązaniem przychodzi paginacja – czyli stronicowanie.

Funkcja, którą zaprezentowałem poniżej wyświetla odnośniki do czterech stron w tył, oraz czterech stron w przód licząc od bieżącej i dodatkowo na bokach linki do pierwszej i ostatniej strony. Dzięki czemu kod jest przystosowany nawet do obsługi kilku tysięcy rekordów.

Poniższy kod umieszczamy na samym początku skryptu:

//obliczanie danych na potrzeby stronicowania
$cur_page = isset($_GET['page']) ? $_GET['page'] : 1;
$results_per_page = 20; //Liczba wyników na stronę
$skip = (($cur_page - 1) * $results_per_page); //liczba pomijanych wierszy na potrzeby stronicowania

Następnie do zmiennej $query, przypisujemy początek naszej kwerendy SQL służącej do pobierania danych które chcemy podzielić na strony (UWAGA: Nie podajmy tutaj klauzuli LIMIT). Przykład:

$query = "SELECT tytul, data, opis FROM artykuly";
$data = mysqli_query($dbc, $query); //pobieramy wszystkie wiersze

Ten kod, wstawiamy po zapytaniu do bazy, które pobiera rekordy do stronicowania:

$total = mysqli_num_rows($data); //liczba wierszy zapisana na potrzeby stronicowania
$num_pages = ceil($total / $results_per_page); //określenie liczby stron
$query .=  " LIMIT $skip, $results_per_page"; //dopisujemy do wcześniejszego zapytania, klauzule LIMIT

//wykonanie kwerendy
$result = mysqli_query($dbc, $query);

Zmienna $dbc, zawiera oczywiście dane dostępu do bazy danych.

Funkcja generate_page_links odpowiedzialna za wygenerowanie linków do stronicowania:

function generate_page_links($cur_page, $num_pages) {
     $page_links = '';

     // odnośnik do poprzedniej strony (-1)
     if ($cur_page > 1) {
          $page_links .= '<a href="' . $_SERVER['PHP_SELF'] . '?page=' . ($cur_page - 1) . '">«</a> ';
     }

     $i = $cur_page - 4;
     $page = $i + 8;

     for ($i; $i <= $page; $i++) {

          if ($i > 0 && $i <= $num_pages) {
               
               //jeżeli jesteśmy na danej stronie to nie wyświetlamy jej jako link    
               if ($cur_page == $i  && $i != 0) {
                    $page_links .= '' . $i;
               }
               else {

                    //wyświetlamy odnośnik do 1 strony
                    if ($i == ($cur_page - 4) && ($cur_page - 5) != 0) { 
                         $page_links .= ' <a href="' . $_SERVER['PHP_SELF'] . '?page=1">1</a> '; 
                    }
               
                    //wyświetlamy "kropki", jako odnośnik do poprzedniego bloku stron
                    if ($i == ($cur_page - 4) && (($cur_page - 6)) > 0) { 
                         $page_links .= ' <a href="' . $_SERVER['PHP_SELF'] . '?page=' . ($cur_page - 5) . '">...</a> '; 
                    } 
               
                    //wyświetlamy liki do bieżących stron
                    $page_links .= ' <a href="' . $_SERVER['PHP_SELF'] . '?page=' . $i . '"> ' . $i . '</a> ';
          
                    //wyświetlamy "kropki", jako odnośnik do następnego bloku stron
                    if ($i == $page && (($cur_page + 4) - ($num_pages)) < -1) { 
                         $page_links .= ' <a href="' . $_SERVER['PHP_SELF'] . '?page=' . ($cur_page + 5) . '">...</a>'; 
                    } 
               
                    //wyświetlamy odnośnik do ostatniej strony
                    if ($i == $page && ($cur_page + 4) != $num_pages) { 
                         $page_links .= ' <a href="' . $_SERVER['PHP_SELF'] . '?page=' . $num_pages . '">' . $num_pages . '</a> '; 
                    }
               }
          }
     }

     //odnośnik do następnej strony (+1)
     if ($cur_page < $num_pages) {
          $page_links .= '<a href="' . $_SERVER['PHP_SELF'] . '?page=' . ($cur_page + 1) . '">»</a>';
     }

     return $page_links;
}

Teraz w dowolnym miejscu możemy wyświetlić odnośniki do stron (należy tylko pamiętać, że kod musi znajdować się w takiej kolejności w dokumencie, w jakiej został przedstawiony w tym artykule):

//wyświetlanie nawigację przy stronnicowaniu
if ($num_pages > 1) {
     echo generate_page_links($cur_page, $num_pages);
}

Spodobało się?

Jeśli tak, to zarejestruj się do newslettera aby otrzymywać informacje nowych artykułach oraz akcjach edukacyjnych. Gwarantuję 100% satysfakcji i żadnego spamowania!

, , , ,

Dodaj komentarz

Komentarze (7)

  • dybik pisze:

    Bardzo słabo wytłumaczone, a w całej treści wielki chaos …
    Przykład: „Ten kod, wstawiamy po zapytaniu do bazy, które pobiera rekordy do stronicowania (w tym zapytaniu nie wpisujemy klauzuli LIMIT – zrobimy to później):” a poniżej jest LIMIT … porażka.

    • lukas124 pisze:

      „Przykład: „Ten kod, wstawiamy po zapytaniu do bazy, które pobiera rekordy do stronicowania (w tym zapytaniu nie wpisujemy klauzuli LIMIT – zrobimy to później):” a poniżej jest LIMIT … porażka.”

      Chodzi o to, że ten fragment wstawiamy po zapytaniu do bazy danych pobierającym dane i w tym zapytaniu nie dajemy klauzuli LIMIT.

      Jak czegoś nie rozumiesz, to mogę Ci wytłumaczyć ;-)

  • Obik pisze:

    cześć, 2 poprawki

    $data = myqli_query($dbc, $query);
    powinno być:
    $data = mysqli_query($dbc, $query);

    mysqli_query($dbc, $query);
    powinno być:
    $result=mysqli_query($dbc, $query);

    Pozdr.

  • PoCoMiNick pisze:

    Zaoszczędziłeś mi wiele godzin pracy :) Dzięki!

  • Kordian Bober pisze:

    Macie gdzieś przykład gdzie to można zobaczyć na stronie?

    Albo inaczej, plik z kodem do odpalenia

Odpowiedz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Pin It on Pinterest