Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP] Problem ze stronnicowaniem
Forum PHP.pl > Forum > Przedszkole
maro123
Witam, mam problem. Otoz probuje zrobic bardzo prosty kod paginacji wynikow ale cos nie za bardzo on dziala, siedze nad tym od wczoraj i dalej klapa. Wyswietla sie tylko 1 strona(domyslna) - przy kolejnych stronach smienna $_GET['strona'] sie powieksza ale nie przeklada sie to na wyswietlenie nastepnych wynikow.

Oto kod:
  1. $limit = 2;
  2. if (is_numeric($_GET['strona'])) {
  3. $strona = (int) $_GET['strona'];
  4. if ($strona < 1) {
  5. $strona = 1;
  6. $limit1 = 0;
  7. $limit2 = $limit;
  8. }
  9. } else {
  10. $strona = 1;
  11. $limit1 = $limit * $strona - $limit;
  12. $limit2 = $limit * $strona;
  13. }
  14.  
  15. $wykonaj=mysql_query("SELECT * FROM ...");
  16. $ile=mysql_num_rows($wykonaj);
  17.  
  18. for($i=0; $i<=ceil($ile / $limit); $i++) {
  19.  
  20. print '<a href="'.($i+1).'">'.($i+1).'</a> | ';
  21.  
  22. }
  23.  
  24.  
  25.  
  26.  
  27.  
  28.  
  29. $sql = '
  30. SELECT [...]
  31. LIMIT '.$limit1.', '.$limit2.'
  32. ';
  33. $result = mysql_query($sql);
  34. while ($row = mysql_fetch_srray($result)) {
  35. // wyswietlanie wpisow
  36. }
  37.  



Zalezy mi na takim efekcie zeby na stronie domyslnej 0 czy tam 1 wyciagane byly dane wedlug
  1. $limit1 = 0;
  2. $limit2 = $limit;

a na reszcie stron wedlug:
  1. $limit1 = $limit * $strona - $limit;
  2. $limit2 = $limit * $strona;
thek
Sprawdź nieujemność i czy jest liczbą, a potem puść moim skryptem autorskim smile.gif
Mój gotowiec robi pełnego paginatora, który na bank nie wyjedzie poza stronę, bo w przypadku 40 podstron nie zrobi 40 linków winksmiley.jpg
  1. $per_page = 10;//tu ilość rekordów na stronę
  2. $ile = 120; //tu ilość rekordów wszystkich, może być count z bazy
  3. $pages = ceil($ile/$per_page);
  4. if($pages > 1) {
  5. $where = 'nazwa_strony'; //tu wpisz jaka ma być ta część niezmienna w linku
  6. }
  7. if($page >=0 AND $page < $pages) {
  8. echo '<div id="pagin">';
  9. if($page > 0) {
  10. echo '<a href="'.$where.'.html">Pierwsza</a>
  11. <a href="'.$where.','.($page-1).'.html">Poprzednia</a>';
  12. }
  13. for($i=$page-3; $i<$page+4; $i++) {
  14. if($i<0 OR $i>=$pages)
  15. continue;
  16. elseif($i == $page)
  17. echo '<a class="chosen" href="'.$where.','.$i.'.html">'.($i+1).'</a>';
  18. else
  19. echo '<a href="'.$where.','.$i.'.html">'.($i+1).'</a>';
  20. }
  21. if($page < $pages-1) {
  22. echo '<a href="'.$where.','.($page+1).'.html">Następna</a>
  23. <a href="'.$where.','.($pages-1).'.html">Ostatnia</a>';
  24. }
  25. echo '</div>';
  26. }
  27. }

Dlaczego tak a nie inaczej? Bo w ten sposób łatwo się generuje linki SEO w moim wypadku smile.gif
$where = 'artykuły-o-programowaniu'
a skrypt dokłada resztę i ostatecznie moge uzyskać link
artykuły-o-programowaniu,4.html
Przy czym manipulując wartością startową i warunkiem wykonania w pętli:
  1. for($i=$page-3; $i<$page+4; $i++)
ustalam sobie "szerokość" ewentualnego paginowania od mojej strony. W tym wypadku będę miał widoczne +/- 3 strony po obu od aktualnej, oprócz "Następna", "Poprzednia". Do tego od 2 podstrony mam link "Pierwsza", a do przedostatniej strony włącznie mam widoczny link "Ostatnia" smile.gif By było weselej całość sobie styluję i ustawiam na aktualnej stronie klasę CSS chosen i całość bloczku ładnie do div o id "pagin" który sobie styluję wedle woli. Po prostu gotowiec na funkcję Paginator. Wystarczy jako parametr podać string z linkiem, liczbę wszystkich rekordów, liczbę rekordów na stronie i otrzymujemy w wynik string jeśli wrzucimy to do zmiennej a nie jako echo. Do tego skrypt nie wyświetla paginatora niepotrzebnie, gdyż dla 1 strony wyników nie uruchamia się nawet.
W efekcie będąc na stronie 4 spośród 5 możliwych paginator wygląda tak (zależnie od stylu oczywiście jeszcze smile.gif ):
Pierwsza Poprzednia 1 2 3 4 5 Następna Ostatnia
Na ostatniej tak:
Pierwsza Poprzednia 2 3 4 5
Na pierwszej tak:
1 2 3 4 Następna Ostatnia

Czyli idealnie tak, jak paginator ma się zachowywać smile.gif Nie generuje głupot i stron ujemnych a linki są poprawne smile.gif Dostosuj go sobie do własnych potrzeb zmieniając tylko w zasadzie linki w znacznikach A i będzie Ci hulało jak ta lala. Nie będziesz się musiał niczym przejmować poza wywołaniem mysql z parametrami $page i $per_page, czyli
  1. mysql_query('SELECT [...] LIMIT '.( $page * $per_page).', '.$per_page );
Weź i sobie przetestuj smile.gif
Tu masz screen z poglądowego widoku strona 4/5 smile.gif
maro123
Kod działa! tylko mam mały problem, jaką wartość powinna mieć $page domyślnie ? bo jak daje 0 to na 1 stronie nie ma nic dopiero na drugiej jest a na 3 mam juz 2x więcej wpisów niż jest ustalone. A z kolei jak dam domyślnie 1 to na 1 stronie mam 2 rekordy (nr 2 i nr 3, a nie nr 1 i nr2) a na drugiej stronie mam 2xwiecej wpisów niz jest ustalone.

Kod na początku taki dopisałem:
  1. if (is_numeric($_GET['strona'])) {
  2. $page = (int) $_GET['strona'];
  3. if ($page < 0) {
  4. $page = 0;
  5. }
  6. } else {
  7. $page = 0;
  8. }
r4xz
polecam jakąś lekturę (na upartego manuala). skrypt nie należy do trudnych, wręcz przeciwnie. także jeszcze raz polecam lekturę o php, a przede wszystkim dobrze obmyśl sprawę. 50% sukcesu to doskonały pomysł (obmyślony w każdym calu)!
maro123
Ok, dzięki jeszcze raz thek ! problem rozwiązany.
thek
Tak to jest po 8 godzinach siedzenia w kodzie w pracy, że się kiełbasi winksmiley.jpg To poniżej jest prawidłowe i tylko to popraw by kod zadziałał smile.gif
  1. mysql_query('SELECT [...] LIMIT '.( $page * $per_page).', '.$per_page );

Złe po prostu w limicie dałem zmienne, w końcu masz mieć $per_page rekordów począwszy od rekordu $strona*$per_page.
Zaraz poprawię też w poście wyżej.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.