Stránkovanie výstupu v PHP

Čo si myslíte, aké zložité je urobiť stránkovanie záznamov, ktoré môžete vidieť na nasledujúcom príklade ?

S mojou PHP triedou je to veľmi jednoduché. Ak chcete vedieť ako na to, tak čítajte ďalej.

Nebudem tu do detialov opisovať ako to funguje, len uvediem nejaké príklady použitia a na zvyšok tu máte zdrojáky ;).

Takže najprv kód z hore uvedeného príkladu. Máme pole so 150 záznamami a vypisujeme ich po 10 záznamov na stránku. O to ktorá stránka sa má zobraziť a takisto aj o vygenerovanie „stránkovača“ sa stará objekt triedy MyPaginator.

  1. <?
  2. require('MyPaginator.class.php');
  3.  
  4. $i = 1;
  5. /**
  6.  *  pole $a bude obsahovať všetky záznamy,
  7.  *  ale my budeme vypisovať len 10 záznamov na stránku
  8.  */  
  9. for($i = 1; $i <= 150; $i++) {
  10.   $a[] = 'Záznam číslo ' . $i;
  11. }
  12.  
  13. /**
  14.  *  vytvorenie novej inštancie "stránkovača"
  15.  *  prvý argument určuje celkový počet záznamov
  16.  *  druhý argument určuje počet záznamov na stránku  
  17.  */
  18. $paginator = new MyPaginator($i-1, 10);
  19.  
  20. /**
  21.  *  vypísanie html kódu pre stránkovač
  22.  */
  23. $paginator->Render();
  24.  
  25. /**
  26.  *  vypísanie konkrétnych záznamov na základe údajov zo stránkovača
  27.  */
  28. for($j = 0; $j < $paginator->ItemsPerPage; $j++) {
  29.   echo $a[$paginator->Offset+$j] . "<br />\n";
  30. }
  31.  
  32. $paginator->Render();
  33. ?>

Tu máte celý zdroják príkladu a zdroják triedy MyPaginator.

Vzhľad stránkovača si môžete upraviť pomocou CSS, alebo samotné html, ktoré sa generuje môžete zmeniť úpravou metód Render() a PrintIndex().

Ak je vám moj stránkovač povedomý, tak vedzte, že som sa inšpiroval QPaginatorom z výborného frameworku Qcodo, avšak ten môj sa dá použiť samostatne…

Príklad využitia pri SQL dotaze

Ukážem čiste len príklad selectu. Predpokladá sa, že $objPaginator už bol inicializovaný s celkovým počtom záznamov a s počtom záznamov na stránku.

  1. $sqlQuery = printf("SELECT * FROM tabulka LIMIT %s, %s", $objPaginator->Offset, $objPaginator->ItemsPerPage);

Uvedené príklady sú síce jednoduché, ale verím, že na pochopenie toho ako to funguje sú postačujúce ;). Ak máte nejaké otázky tak do komentárov s nimi!

Stránkovanie vo WordPresse

WordPress poskytuje pre stránkovanie podobnú funkciu, ktorá dokáže vygenerovať linky na jednotlivé podstránky či už ako HTML linky, HTML zoznam s linkami, alebo PHP pole… Funkcia sa volá paginate_links.

7 komentárov k “Stránkovanie výstupu v PHP”

  1. dobrý deň, ja sa chcem spytať ako dam z databazy tovary tak aby sa zobrazovali napr. pomocou mysql_fetch_array($sql){include(„tovary_box.php“);}; kde $sql je výber z tabulky mysql_query(…)

    dakujem

  2. ma to chybicku ked pridem na stranku zo strankovanim tak sa mi maju ukazat najnovsie zaznami a nie najstarsie

    dalsia vec pri ulozeni stranky povedzme page 9 by mal jej obah zostat aj pri pridany novych zaznamov

  3. Tak tá chybička tam nie je, treba si to presnejšie pozriet :) Nie je problém, aby na stránke so stránkovanim boli najnovšie záznamy, stačí tomu prispôsobiť napríklad SQL select…

    A s tým druhým bodom tiež nesuhlasím, je to vec pohľadu, mne vyhovuje, že sa staršie veci posúvajú ďalej a nie sú stále na rovnakej stránke, a mnoho mnoho iných webov to má rovnako

  4. UPDATE: do článku som pridal link na wordpress funkciu pre stránkovanie a takisto som opravil chybný SQL príklad…

  5. Zdravim, :-)

    Strankovac je super len mam jednu otazocku. Poradte mi prosim ako mam aplikovat strankovac na result z mysql_query().LIMIT v dotaze sa pravdepodobne asi nepouzije.
    Tu je moj pokus:

    $result=mysql_query(„SELECT * FROM komentar“);
    if(!$result):
    echo mysql_errno($spojenie) . „:“ . mysql_error($spojenie). „\n“;
    else:
    $j=0;
    while($row = mysql_fetch_row($result)):
    $j=$j++;
    echo $row[$paginator->Offset+$j];
    endwhile;
    endif;

    Opravte ma prosim. Vopred Vam dakujem,

  6. Najprv sa spytam, ze preco nemozete pouzit limit v dotaze ? Je to ovela efektivnejsie ako vyselectovat vsetko a potom to filtrovat…

    A ku kodu: nepojde to. mysql_fetch_row vrati jeden riadok z vystupu ako asociativne pole, cile $row[$paginator->Offset+$j] nema ziadny zmysel…

    Jednoznacne by som to spravil cez zmenu selectu (pridanie LIMIT $objPaginator->Offset, $objPaginator->ItemsPerPage).

Pridaj komentár

Vaša e-mailová adresa nebude zverejnená. Vyžadované polia sú označené *