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].