Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wyświetlanie danych z tabeli z podziałem na strony
Forum PHP.pl > Forum > Bazy danych > MySQL
winnetu
  1. <?php
  2. $query = "SELECT * FROM gal ORDER by id DESC";
  3. $result = mysql_query($query);
  4. $num = mysql_numrows($result);
  5.  
  6. $i = 0;
  7. while ($i < $num) {
  8.  
  9. $tresc = mysql_result($result,$i,"tresc");
  10. $od = mysql_result($result,$i,"od");
  11.  
  12. $i++;
  13. }
  14. ?>


W tabeli gal mam w chwili obecnej ponad 50 rekordów. Chciałbym były one wyświetlane po 10 na stronie. Tak aby automatycznie pojawiały się linki do kolejnych stron: strony 1 | 2 | ... | n
Wiem, że do ograniczenia wyników na jednej stronie jest polecenie LIMIT 0, 10 ale nie wiem jak zrobić aby dodawały się linki do kolejnych stron, na których będą rekordy 11-20, 21-30 itd, itd.
barat
Jestem początkujący, ale pokaże Ci co ja zrobiłem:

(Większość komentarzy w j.ang ponieważ tak już się nauczyłem, polskie dopisane teraz)

Ten fragment zajmuje się łączeniem z bazą, i liczeniem potrzebnych limitów:

  1. <?php
  2. //do strony przekazany jest $page = $_GET['page'], oczywiście po sprawdzeniach
  3.  
  4. $conn = dbConnect(); //moja funkcja do łączenia się z bazą danych, Ty możesz mieć inną 
  5.  
  6. // Check number of rows (for pagination)
  7. $count = 'SELECT * FROM news';
  8. $count = mysql_query($count) or die(mysql_error());
  9. $numRows = mysql_num_rows($count);
  10. // Count limit for results
  11. $show_limit = 10; // określa ile ma być newsów na stronie
  12. $max_pages = ceil($numRows/$show_limit);
  13. $page = ($page = 0 || !$page || !is_numeric($page) ? 1 : $page);
  14. $page = ($page <= $max_pages ? $page : $max_pages);
  15. $limit_start = ($page * $show_limit) - $show_limit; //określa jaki będzie LIMIT w poleceniu SQL
  16. ?>


Teraz mając już $max_pages i $limit_start mogę zapytać SQL

  1. <?php
  2. // SQL query for get news
  3. $sql = "SELECT * FROM `news` ORDER BY `news_date` DESC LIMIT $limit_start, $show_li
    mit"
    ;
  4. $result = mysql_query($sql) or die(mysql_error());
  5. ?>


Następnie wyświetlam wyniki normalnie za pomocą while , a na samym dole dodaję:

  1. <?php
  2. paginate($page, $max_pages);
  3. ?>


A teraz jak wygląda sama funkcja paginate():

  1. <?php
  2. function paginate($cur_page, $last_page, $number = 1)
  3. {
  4. $real_number = ($number * 2) +1;
  5. if ($last_page < $real_number) {$istart = 1; $iend = $last_page;}
  6. elseif ($cur_page == 1) {$istart = 1; $iend = 1 + ($number * 2);}
  7. elseif ($cur_page == $last_page) {$istart = $cur_page - ($number * 2); $iend = $cur_page;}
  8. else {
  9. if ($cur_page + $number > $last_page) {
  10. $iend = $last_page;
  11. $istart = $last_page - ($number * 2); 
  12. } elseif ($cur_page - $number < 1) {
  13. $istart = 1;
  14. $iend = ($number * 2 + 1);
  15. } else {
  16. $istart = $cur_page - $number; $iend = $cur_page + $number;
  17. }
  18. }
  19. echo '<div id="pagination">';
  20. echo '<ul>';
  21. echo '<li class="pgn1st">';
  22. echo '<a href="?page=1" id="paginfirst';
  23. if ($cur_page == 1) {echo 'none';};
  24. echo '"><span>first</span></a></li>';
  25. echo '<li class="pgnprev"><a href="?page='.($cur_page == 1 ? 1 : $cur_page-1).'" id="paginprev';
  26. if ($cur_page == 1) {echo 'none';};
  27. echo '"><span>prev</span></a></li>';
  28. for($i=$istart; $i<=$iend; $i++)
  29. {
  30. echo '<li class="num"><a href="?page='.$i.'"';
  31. if ($i == $cur_page) {echo ' class="active"';};
  32. echo '>'.$i.'</a></li>';
  33. }
  34. echo '<li class="pgnnext"><a href="?page='.($cur_page == $last_page ? $cur_page : $cur_page + 1).'" id="paginnext';
  35. if ($cur_page == $last_page) {echo 'none';};
  36. echo '"><span>next</span></a></li>';
  37. echo '<li class="pgnlast"><a href="?page='.$last_page.'" id="paginlast';
  38. if ($cur_page == $last_page) {echo 'none';};
  39. echo '"><span>last</span></a></li>';
  40. echo '</ul>';
  41. echo '</div>';
  42. }
  43. ?>


Funkcja wyświetla paginator w postaci:

<< < 1 2 3 > >>
Czyli

FIRST PREV 1 2 3 NEXT LAST

Dla 9 podstron, gdy będziemy znajdowali się na przykład na 6 będzie to wyglądać tak:

FIRST PREV 5 6 7 NEXT LAST

Przy czym można jej wstawić opcjonalny parametr

paginate($page, $max_pages, OPCJA);

Który może wynosić 2, 3 itp ... określa ile będzie cyferek ... dla 2 będzie to od 1 do 5 , dla 3 od 1 do 7 ...
Paginator podświetla aktualną stronę, jeśli stron jest mniej niż limit to wyświetla ich mniej...

Oparty jest na listach i wyświetla listę w postaci:

  1. <div id="pagination"><ul>
  2. <li class="pgn1st"><a href="?page=1" id="paginfirstnone"><span>first</span></a></li>
  3. <li class="pgnprev"><a href="?page=1" id="paginprevnone"><span>prev</span></a></li>
  4. <li class="num"><a href="?page=1" class="active">1</a></li>
  5. <li class="num"><a href="?page=2">2</a></li>
  6. <li class="pgnnext"><a href="?page=2" id="paginnext"><span>next</span></a></li>
  7. <li class="pgnlast"><a href="?page=2" id="paginlast"><span>last</span></a></li>
  8. </ul></div>


Czyli bardzo łatwo to ostylować smile.gif Tutaj przykład dla 14 newsów w bazie i limitu 10 na strone, więc tylko 2 podstrony smile.gif
Dodatkowo, FIRST, PREV , LAST, NEXT mają style z dopiskiem none gdy już nie ma dalszych stron do wyświetlenia (np jeśli znajdujemy się na stronie 9 z 9 to dalej już nie będzie NEXT i LAST ... można wtedy je ostylować jako szare lub display:none)
FIRST PREV NEXT LAST są w SPAN, by można było je zastąpić obrazkami (wtedy dla spanów display:none)

Linki w postaci jakasstrona.php?page=1


Skrypt jak widać amatorski, ale u mnie działa ... jak się podszkolę to napiszę sobie lepszy, na razie ten musi starczyć smile.gif
winnetu
Yyyy ja jestem bardzo początkujący. Teraz mam zadanie na weekend, przeanalizować i zrozumieć Twój kod, bo narazie to czarna magia smile.gif
barat
W sumie powinno zadziałać bez niczego...

Zamień tylko news na gal oraz order by news_id na id w zapytaniach SQL i powinno śmigać smile.gif
w $show_limit ustaw sobie ile ma być fotek na stronie smile.gif

czyli na samej górze funkcja

potem pierwszy kod (ten do liczenia)
potem zapytanie SQL wyciągające newsy
potem Twój kod wyświetlajacy galerie (zapewne masz to w jakiejś pętli)
na końcu

<?php
paginate($page, $max_pages);
?>

i linki w postaci galeria.php?page=1 (zamiast galeria.php moze być dowolna inna nazwa, na przykład jakasstrona.php - w zależności jak się nazywa Twój plik z galerią))
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.