Stronicowanie
Z PHPEdia.pl
Spis treści |
Stronicowanie
Często zachodzi potrzeba podzielenia wyników pobranych z bazy na mniejsze części i wyświetlenie wyników podzielonych na porcje. Jest kilka sposobów na rozwiązanie tego problemu. Zobacz również: Dzielenie na strony (nawigator)
Zaczynamy
Zazwyczaj zaczynamy mniej więcej z takim kodem:
<?php /* * połączenie z bazę itp */ $SQL = "SELECT * FROM moja_baza ORDER BY date ASC"; // pobiera wszystkie rekordy z bazy, (sortując wg daty rosnąco - w tym przypadku) $RES = mysql_query($SQL); // wykonujemy zapytanie while($AFR = mysql_fetch_assoc($RES)){ /*Wyswietlanie wyników, przykładowo:*/ echo 'tytuł: '.$AFR['Title'].'<br />'; } ?>
Tym sposobem, wszystko się pięknie wyświetla - nasze 1000 tytułów albumów, newsów, lub czegokolwiek innego.
Sposób pierwszy
Sposób najłatwiejszy, najszybszy i jednocześnie najmniej 'profesjonalny'. Nasz kod z pierwszej części modyfikujemy następująco:
<?php // ile ma być wyświetlanych rekordów na stronie define('ILOSC_WYNIKOW_NA_STRONIE', 5); /* * połączenie z bazą, itp. */ $SQL = "SELECT COUNT(*) FROM moja_baza"; // Zapytanie liczące ilość wpisów w bazie $RES = mysql_query($SQL); list($iloscWpisow) = mysql_fetch_row($RES); $SQL = "SELECT * FROM moja_baza ORDER BY date ASC LIMIT ".mysql_escape_string((int)$_GET['porcja']*ILOSC_WYNIKOW_NA_STRONIE).",".ILOSC_WYNIKOW_NA_STRONIE; // pobiera ILOSC_NA_STRONIE rekordów z bazy, sortując wg daty rosnąco, zaczynając od $_GET['porcja']*ILOSC_NA_STRONIE $RES = mysql_query($SQL); // wykonujemy zapytanie while($AFR = mysql_fetch_assoc($RES)){ /*Wyswietlanie wyników, przykładowo:*/ echo 'tytuł: '.$AFR['Title'].'<br />'; } //Teraz wypadało by wyświetlić jakąś nawigację //jesli nie jesteśmy na pierwszej stronie if($_GET['porcja']>0){ //wyswietlamy link do poprzedniej strony echo '<a href="?porcja='.($_GET['porcja']-1).'">Poprzednie</a> '; } for($i = 0;$i<=floor($iloscWpisow/ILOSC_WYNIKOW_NA_STRONIE);$i++){ echo '<a href="?porcja='.($i).'">[ '.($i+1).' ]</a> '; } //jeśli nie jesteśmy na ostatniej stronie if($_GET['porcja']<floor($iloscWpisow/ILOSC_WYNIKOW_NA_STRONIE)){ //wyswietlamy link do nastepnej strony echo ' <a href="?porcja='.($_GET['porcja']+1).'">następne</a>'; } ?>
Po wykonaniu tego kodu widzimy, że na naszej stronie pojawiły się linki o nazwach 'Poprzedne', 'Następne', oraz cyferki poszczególnych stron. O to nam chodziło.
Dążąc do doskonałości
Czyli teraz będzie naprawde dobrze
Poddajemy nasz kod lekkiej modyfikacji:
<?php define('ILOSC_WYNIKOW_NA_STRONIE', 5); /* * połączenie z bazą, itp. */ $SQL = "SELECT SQL_CALC_FOUND_ROWS * FROM moja_baza ORDER BY date ASC LIMIT ".mysql_escape_string((int)$_GET['porcja']*ILOSC_WYNIKOW_NA_STRONIE).",".ILOSC_WYNIKOW_NA_STRONIE; // pobiera ILOSC_NA_STRONIE rekordów z bazy, sortując wg daty rosnąco, zaczynając od $_GET['porcja']*ILOSC_NA_STRONIE $RES = mysql_query($SQL); // wykonujemy zapytanie while($AFR = mysql_fetch_assoc($RES)){ /*Wyświetlanie wyników, przykładowo:*/ echo 'tytuł: '.$AFR['Title'].'<br />'; } // w inny sposób pobieramy ilosc danych w bazie $SQL = "SELECT FOUND_ROWS() as Ilosc"; $RES= mysql_query($SQL); list($iloscWpisow) = mysql_fetch_row($RES); //Teraz wypadało by wyświetlić jakąś nawigację //jeśli nie jesteśmy na pierwszej stronie if($_GET['porcja']>0){ //wyswietlamy link do poprzedniej strony echo '<a href="?porcja='.($_GET['porcja']-1).'">Poprzednie</a> '; } for($i = 0;$i<=floor($iloscWpisow/ILOSC_WYNIKOW_NA_STRONIE);$i++){ echo '<a href="?porcja='.($i).'">[ '.($i+1).' ]</a> '; } //jeśli nie jesteśmy na ostatniej stronie if($_GET['porcja']<floor($iloscWpisow/ILOSC_WYNIKOW_NA_STRONIE)){ //wyświetlamy link do nastepnej strony echo ' <a href="?porcja='.($_GET['porcja']+1).'">następne</a>'; } ?>
Podsumowanie
Do zapytania pobierającego, dodaliśmy SQL_CALC_FOUND_ROWS, a następnie kolejnym zapytaniem pobieramy FOUND_ROWS() ... nie trzeba chyba tłumaczyć iż jest szybsze od 'count(*)' :)
więcej na temat SQL_CALC_FOUND_ROWS można przeczytać: http://dev.mysql.com/doc/mysql/en/information-functions.html [Manual SQL].
