Często prezentując wyniki zapytania z bazy MySQL na swojej stronie za pomocą skryptu PHP uwidacznia się potrzeba podziału tych wyników na poszczególne strony, szczególnie kiedy tych rekordów jest wiele, a skrypt wykonywałby się bardzo długo, aby je załadować. W związku z tym chciałbym Wam przedstawić funkcję do stronnicowania, z której korzystam już jakiś czas. Napisanie własnej funkcji umożliwiającej stronnicowanie jest o tyle dobre, że będziesz mógł ją wykonać w każdym pliku składającym się na skrypt bez konieczności powielania raz już napisanego kodu.
Naszą funkcje umieszczę w pliku functions.php, w którym znajdują się wszystkie funkcje wykorzystywane globalnie. Rozpocznijmy więc o deklaracji argumentów funkcji:
1 | function page_number($query, $num, $link, $page) { |
Pierwszy argument $page odnosi się do zapytania, które pozwoli nam zobaczyć ile rekordów znajduje się w naszej bazie danych, kolejny $num informuje ile rekordów ma się znajdować na jednej stronie, argument $link jest niczym innym jak adresem do pliku, może przyjmować takie wartości jak np. „news.php” czy „index.php?modules=news”. Ostatni argument $page zwraca numer aktualnej strony skryptu. Przejdźmy teraz do „ciała” funkcji:
1 2 3 | $result = mysql_query($query); $numquery=mysql_num_rows($result); $numpages = ceil($numquery / $num); |
Pierwsze dwie linijki odpowiadają za wywołanie zapytania MySQL oraz zwrócenie liczby rekordów tego zapytania. Natomiast ostatnia linijka zwraca liczbę stron jaką skrypt będzie generował. Teraz musimy wyświetlić kolejne numery stron:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | $number_page = '<center>'; if ($numpages > 1) { if ($page > 1) { $prevpage = $page - 1 ; $number_page .= '<a href="'.$link.'&page='.$prevpage.'">'; $number_page .= '<<</a> '; } if($page>6) { $number_page .= '<a href="'.$link.'&page='.$page.'>Pierwsza</a>, ..., '; } for ($i=$page-5; $i < $page+5; $i++) { if ($i == $page) { $number_page .= '<b>'.$i.'</b>'; } elseif ($i>0 && $i<=$numpages) { $number_page .= '<a href="'.$link.'&page='.$i.'">'.$i.'</a>'; } if ($i < $numpages && $i>0) { $number_page .=', '; } } if($page<$numpages-5) { $number_page .='..., <a href="'.$link.'&page='.$numpages.'">Ostatnia</a>'; } if ($page < $numpages) { $nextpage = $page + 1 ; $number_page .=' <a href="'.$link.'&page='.$nextpage.'">'; $number_page .='>></a>'; } } $number_page .='</center>'; |
Jak działa powyższy kod? Jeśli stron jest mniej niż 6 wyświetla się tak:
<< 1, 2, 3, 4 >>
Gdzie pogrubiona cyfra, to numer aktualnej strony, a reszta to linki do danej strony. Przy większej ilości stron skrypt wyświetla stronnicowanie tak:
<< Pierwsza, ..., 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, …, Ostatnia >>
Jak wywołać kod w naszym skrypcie? Bardzo prosto, najpierw musisz dołączyć plik functions.php:
1 | include("functions.php"); |
W miejscu, gdzie ma się wyświetlać stronnicowanie umieszczasz:
1 2 3 | $query = 'SELECT id FROM news '; $module_name = 'index.php?id=account'; page_number($query, 15, $module_name, $page); |
Pamiętaj również, że argument $page jest zmienną w tym skrypcie, która pobierana jest z adresu skryptu za pomocą $_GET['page'], czyli adres skrypt.php?id=news&page=15 powoduje, że zmienna $page przyjmuje wartość „15″. Dodatkowo w skrypcie zadeklaruj:
1 2 3 4 | if ($page == '') { $page = 1 ; } $offset = ($page-1) * 15; |
Powoduje to, że w przypadku braku zadeklarowanej zmiennej page przyjmie ona wartość jeden. Natomiast zmienna offset będzie wykorzystywana w zapytaniu, które odpowiada za wyświetlanie rekordów na stronie. Ta zmienna wskazuje miejsce, od którego ma zacząć liczyć kolejne piętnaście rekordów. Należy ją umieścić tak w zapytaniu:
1 | $result = mysql_query('SELECT id, title, views, date FROM news ORDER BY date DESC, id DESC LIMIT '.$offset.', 15'); |
W taki oto sposób możemy funkcję page_number() wykorzystywać w dowolnym pliku, który należy do naszego skryptu.
Popularity: 4%
[...] bazę danych, czwarty to dodatkowy tekst i ostatni to numer strony, jeśli korzystamy z numeracji (pisałem o tym wcześniej). W zmiennej $url przedstawiamy strukturę “przyjaznego linku” i wykorzystując [...]