Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL][PHP] Problem ze stronnicowaniem, problem początkującego.
maro123
post 24.08.2009, 13:49:42
Post #1





Grupa: Zarejestrowani
Postów: 22
Pomógł: 0
Dołączył: 24.08.2009

Ostrzeżenie: (0%)
-----


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;
Go to the top of the page
+Quote Post
thek
post 24.08.2009, 14:56:33
Post #2





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




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


Ten post edytował thek 24.08.2009, 20:31:23


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
maro123
post 24.08.2009, 16:59:22
Post #3





Grupa: Zarejestrowani
Postów: 22
Pomógł: 0
Dołączył: 24.08.2009

Ostrzeżenie: (0%)
-----


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. }
Go to the top of the page
+Quote Post
r4xz
post 24.08.2009, 17:38:20
Post #4





Grupa: Zarejestrowani
Postów: 673
Pomógł: 106
Dołączył: 31.12.2008

Ostrzeżenie: (0%)
-----


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)!


--------------------
Go to the top of the page
+Quote Post
maro123
post 24.08.2009, 19:15:10
Post #5





Grupa: Zarejestrowani
Postów: 22
Pomógł: 0
Dołączył: 24.08.2009

Ostrzeżenie: (0%)
-----


Ok, dzięki jeszcze raz thek ! problem rozwiązany.
Go to the top of the page
+Quote Post
thek
post 24.08.2009, 20:30:33
Post #6





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




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.

Ten post edytował thek 24.08.2009, 20:36:56


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 22.07.2025 - 18:49