Stronicowanie wyników z bazy danych

02 marca 2007

Kolega dzisiaj mnie prosił o funkcję, dzięki której będzie możliwe tzw. stronicowanie wyników z bazy (w tym przypadku MySQL). Chodzi o to aby tworzyło się automatycznie coś takiego:

<<< poprzednia [ 1 ] [ 2 ] [ 3 ] ... [ 6 ] 7 [ 8 ] ... [ 13 ] [ 14 ] [ 15 ] następna >>>

Tak się składa, że już jakiś czas temu coś takiego sobie napisałem ;) Trochę się przy tym namęczyłem, nie jestem też pewien czy jest super optymalne, na pewno da się to trochę poprawić, może przerobić na obiekty ale.. działa dobrze i to wystarczy :)


W załącznikach są dwie wersje. Jedna dla normalnego wykorzystania, druga dla tych, którzy korzystają ze SMARTY. A teraz mała instrukcja.

1) zwykła funkcja

Najpierw musimy wyciągnąć z bazy danych ilość wszystkich rekordów:

PHP:
  1. $licz=mysql_fetch_row(mysql_query('zapytanie do bazy danych'));

Samo zapytanie może wyglądać np. tak:

SQL:
  1. SELECT COUNT(id) FROM tabela WHERE warunek=1

Następnie określamy ile wyników ma być na jednej stronie:

PHP:
  1. $na_stronie=15;

Teraz mały warunek, który sprawdza czy wszystko OK ze zmienną przekazującą numer strony:

PHP:
  1. if($_GET['aktualnie']>0 AND $_GET['aktualnie']%$na_stronie==0 AND $_GET['aktualnie']<$licz[0])
  2. {
  3. $aktualnie=$_GET['aktualnie'];
  4. }
  5. else
  6. {
  7. $aktualnie=0;
  8. }

Dodajemy naszą funkcję:

PHP:
  1. include_once 'funkcja_porcjowanie.php';

I wywołujemy ją:

PHP:
  1. $porcjowanie=porcjowanie($aktualnie, $licz[0], $na_stronie, 'plik.php?', '#kotwica');

A teraz małe objaśnienie argumentów przekazywanych do funkcji. Pierwsze trzy są chyba jasne i nie radzę ich zmieniać :) Czwarty to początek linku. Tak będą się zaczynać wszystkie odnośniki wygenerowane przez funkcję. Do adresu zostanie doczepiony tylko parametr "aktualnie". Natomiast ostatni argument można pominąć. Właściwie przydaje się tylko wtedy gdy chcemy dodać do linku kotwicę w HTML'u. Po prostu dokleja coś na końcu wyżej wspomnianych linków. Po wywołaniu tej funkcji adresy będą wyglądać tak:

CODE:
  1. plik.php?aktualnie=X#kotwica

Cała belka nawigacyjna będzie w zmiennej $porcjowanie. Do ostatecznego zapytania MySQL, które wybiera wyniki na stronie dodajemy to:

SQL:
  1. LIMIT $aktualnie, $na_stronie

2) funkcja dla SMARTY

Dla szablonów w pliku .php robimy praktycznie wszystko to samo. Jedyna drobna różnica jest przy wywołaniu funkcji:

PHP:
  1. $porcjowanie=porcjowanie($aktualnie, $licz[0], $na_stronie);

PHP:
  1. if($porcjowanie!='')
  2. $smarty->assign('porcjowanie', $porcjowanie);

Jak widać funkcja otrzymuje tylko trzy argumenty, reszta jest załatwiana w pliku .tpl. Oto jego zawartość:

SMARTY:
  1. {if count($porcjowanie)>0}
  2.  
  3. <p style="text-align: center">{section name=porcjowanie loop=$porcjowanie}
  4. {if isset($porcjowanie[porcjowanie].poprzednia)}
  5. <a href="plik.php?{$porcjowanie[porcjowanie].poprzednia}"><<< poprzednia</a>
  6. {elseif isset($porcjowanie[porcjowanie].brak)}
  7. ...
  8. {elseif $porcjowanie[porcjowanie].aktualnie>0}
  9. <span style="font-size: 12px"><strong>{$porcjowanie[porcjowanie].aktualnie}</strong></span>
  10. {elseif isset($porcjowanie[porcjowanie].parametr)}
  11. <a href="plik.php?{$porcjowanie[porcjowanie].parametr}">{$porcjowanie[porcjowanie].liczba}</a>
  12. {elseif $porcjowanie[porcjowanie].nastepna>0}
  13. <a href="plik.php?{$porcjowanie[porcjowanie].nastepna}">następna >>></a>
  14. {/if}
  15. {/section}
  16.  
  17. {/if}

Oczywiście każdy dostosuje sobie HTML do swoich potrzeb. Zastosowałem takie nazewnictwo, że chyba od razu widać co jest do czego.

Mam nadzieję, że komuś ułatwi to życie :)

Pliki:

zwykłe porcjowanie
porcjowanie dla SMARTY

Dodaj komentarz

16 odpowiedzi dla tego wpisu

  1. kmg napisał:

    ekhmmm… wiem, że sie czepiam, ale:
    $orcjowanie=porcjowanie(…

    A przegladnac przeglądne ;P . Jak bedzie czas.

  2. MariuszT napisał:

    OK, dzięki, poprawiłem literówkę :) To cholerne wordpress jest tak niedopracowane … ;/ Szlag mnie trafia z tym skryptem :/ Głupi edytor WYSIWYG przy edycji posta zamienia mi wszystko na encje i za każdym razem muszę przeglądać kod i go poprawiać :[

  3. Daniel napisał:

    Witam. probowalem ten skrypt sprawdzic u siebie jednak nie wiem jak ma wygladac to drugie zapytanie i gdzie ono ma sie zawierac w kodzie… czy bylaby mozliwosc umieszczenia na stronie jakiegos przykladu z obsluga bazy mysql ?? pager tworze w smarty.pozdrawiam

  4. MariuszT napisał:

    Yyy… Jakie drugie zapytanie? :) Rób wszystko tak jak to opisałem. Jak nie będzie działało to wystaw gdzieś źródło swojego pliku, postaram się podpowiedzieć co tam jest nie tak.

  5. DeXTeD napisał:

    Nie wiem czemu mi nie działa :/ możesz mi pomóc?
    Wogole nie wyświetla mi tych >>
    A to kod:

    $quROW = „SELECT news_id „.
    „FROM cms_news „;

    $licz=mysql_fetch_row(mysql_query($quROW));

    $na_stronie=2;

    if($_GET['aktualnie']>0 AND $_GET['aktualnie']%$na_stronie==0 AND $_GET['aktualnie']

  6. DeXTeD napisał:

    {
    $aktualnie=$_GET['aktualnie'];
    }
    else
    {
    $aktualnie=0;
    }

    include_once ‘pages.php’;

    $porcjowanie=porcjowanie($aktualnie, $licz[0], $na_stronie, ‘plik.php?’, ‘#kotwica’);

    echo ‘…..’.$porcjowanie.’…..’;

    Przycieło :P

  7. MariuszT napisał:

    Zobacz moje zapytanie przypisane do zmiennej $licz i porównaj je ze swoim. Podążaj dokładnie według instrukcji i wszystko będzie działało.

  8. Wojtek napisał:

    Witam

    A jak to zrobic w wordpress ? Znalem juz opisy w internecie. Ale proboy zastosowania tego na stronie, którą pomagam nadzorować nie pomoglo.

    Wrzuciłem funkcje

    przed zmkniecie glownej petli z postami

    Ale zadne linki srtonicowania mi sie nie pojawiaja na stronie

    Kombinowalem tez inne sposoby wykorzystania tej funkcji

    <?php wp_link_pages(‘before=&after=&next_or_number=number&pagelink=page %’); ?>
    <?php link_pages(‘Strony: ‘, ”, ‘numer’); ?>
    ale tez bez sukcesów

    Moge prosic o pomoc
    Pozdrawaim
    Wojtek

  9. MariuszT napisał:

    @Wojtek – nie wiem czemu Ci to nie działa bo powinno. Zainteresuj się może tym pluginem: http://lesterchan.net/portfoli.....p-pagenavi

  10. kakasia napisał:

    Witaj. Regularnie sciagam sobie muzyczke dzieki Twojej stronce respect za to dla Ciebie. Mam jednak mały problem. Piosenki nie chca mi sie odtwarzac na itunes a tylko przez itunes moge wgrac je sobie na ipoda. czy miałbys moze jakis pomysł jak zaradzic zeby możnabyło piosenki odtwarzac w itunes ? Pozdrówki i bede wdzieczna za odp :)

  11. MariuszT napisał:

    Nie miałem styczności ani z iTunes ani z iPodem, przykro mi.

    PS
    Następnym razem pisz pod wpisem, który ma jakikolwiek związek z Twoim komentarzem a nie tak byle gdzie :/

  12. Michał napisał:

    Przedstawiłbyś klasę do stronicowania :)
    Żeby można było korzystać z różnych baz danych.

  13. MariuszT napisał:

    Hmmm właśnie piszę coś swojego (taki niby framework, niby cms) więc może będę przepisywał tą funkcję na coś bardziej uniwersalnego. Ale niczego nie obiecuję :)

  14. Bartek napisał:

    Witam. Postanowiłem skorzystać z tego skryptu tylko chyba nie za bardzo chce mi działać. Robiłem wszystko według twoich wskazówek, ale pokazuje się pusta strona. Nie wiem jak pokazać ci to co zrobiłem, bo napisałeś że nie będziesz odpisywał jak napisze na maila lub gg. Proszę o jak najszybszy kontakt, bo takiego skryptu szukałem od kilku dni i nie mogłem nic znaleźć.

  15. MariuszT napisał:

    Nie wiem co Ci nie działa. Zrób użytek z takich funkcji jak echo, print_r/var_dump. Ustaw też pełne raportowanie błędów.

  16. Adamski napisał:

    Super skrypt. Szukałem i rozważałem kilkanaście rozwiązań. Wszystkie po kilkaset lini kodu i na obiektach. W dodatku niektóre działają pod php4 a inne pod php5 przez to problemy z kompatybilnością. A ten skrypcik jest najprostszy z możliwych a działa super. Pozdrawiam i polecam.

Odpowiedz



Podobne wpisy: