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); }
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.
„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ć ;-)
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.
Dzięki za wyłapanie literówek ;) Poprawione.
Zaoszczędziłeś mi wiele godzin pracy :) Dzięki!
Macie gdzieś przykład gdzie to można zobaczyć na stronie?
Albo inaczej, plik z kodem do odpalenia
Gdzieś to miałem, muszę poszukać ;) ale prędzej to chyba raczej będzie napisanie jakiegoś prostego przykładu.