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.