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:
Samo zapytanie może wyglądać np. tak:
-
SELECT COUNT(id) FROM tabela WHERE warunek=1
Następnie określamy ile wyników ma być na jednej stronie:
-
$na_stronie=15;
Teraz mały warunek, który sprawdza czy wszystko OK ze zmienną przekazującą numer strony:
-
if($_GET['aktualnie']>0 AND $_GET['aktualnie']%$na_stronie==0 AND $_GET['aktualnie']<$licz[0])
-
{
-
$aktualnie=$_GET['aktualnie'];
-
}
-
else
-
{
-
$aktualnie=0;
-
}
Dodajemy naszą funkcję:
-
include_once 'funkcja_porcjowanie.php';
I wywołujemy ją:
-
$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:
-
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:
-
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:
-
$porcjowanie=porcjowanie($aktualnie, $licz[0], $na_stronie);
-
if($porcjowanie!='')
-
$smarty->assign('porcjowanie', $porcjowanie);
Jak widać funkcja otrzymuje tylko trzy argumenty, reszta jest załatwiana w pliku .tpl. Oto jego zawartość:
-
-
<a href="plik.php?{$porcjowanie[porcjowanie].poprzednia}"><<< poprzednia</a>
-
...
-
<span style="font-size: 12px"><strong>{$porcjowanie[porcjowanie].aktualnie}</strong></span>
-
<a href="plik.php?{$porcjowanie[porcjowanie].parametr}">{$porcjowanie[porcjowanie].liczba}</a>
-
<a href="plik.php?{$porcjowanie[porcjowanie].nastepna}">następna >>></a>
-
{/if}
-
{/section}
-
-
{/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:
Blog przede wszystkim o Internecie i mojej pasji jaką jest tworzenie stron www. Ale nie ograniczam się do jednej tematyki, piszę o wszystkim o czym mam ochotę :-)
kmg napisał: 04.03.07 o godzinie 19:11
ekhmmm… wiem, że sie czepiam, ale:
$orcjowanie=porcjowanie(…
A przegladnac przeglądne ;P . Jak bedzie czas.
MariuszT napisał: 05.03.07 o godzinie 0:49
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ć :[
Daniel napisał: 05.04.07 o godzinie 15:43
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
MariuszT napisał: 05.04.07 o godzinie 16:26
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.
DeXTeD napisał: 05.01.08 o godzinie 22:23
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']
DeXTeD napisał: 05.01.08 o godzinie 22:24
{
$aktualnie=$_GET['aktualnie'];
}
else
{
$aktualnie=0;
}
include_once ‘pages.php’;
$porcjowanie=porcjowanie($aktualnie, $licz[0], $na_stronie, ‘plik.php?’, ‘#kotwica’);
echo ‘…..’.$porcjowanie.’…..’;
Przycieło
MariuszT napisał: 06.01.08 o godzinie 22:58
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.
Wojtek napisał: 20.10.08 o godzinie 10:30
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
MariuszT napisał: 20.10.08 o godzinie 23:06
@Wojtek – nie wiem czemu Ci to nie działa bo powinno. Zainteresuj się może tym pluginem: http://lesterchan.net/portfoli.....p-pagenavi
kakasia napisał: 29.10.08 o godzinie 23:28
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
MariuszT napisał: 29.10.08 o godzinie 23:43
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 :/
Michał napisał: 06.04.09 o godzinie 19:13
Przedstawiłbyś klasę do stronicowania
Żeby można było korzystać z różnych baz danych.
MariuszT napisał: 07.04.09 o godzinie 9:42
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ę
Bartek napisał: 10.07.11 o godzinie 15:51
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źć.
MariuszT napisał: 10.07.11 o godzinie 19:08
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.
Adamski napisał: 19.12.11 o godzinie 22:12
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.