Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Stronnicowanie wyników z bazy danych.
Forum PHP.pl > Forum > PHP
progman
Witam, cały czas staram sobie poradzić wprowadzić stronnicowanie (dzielenie na strony) w moim projekcie bazo-danowym opartym na bazie "PostgreSQL" ale nie daję sobie rady, próbowałem na tablicach ale coś nie wychodzi, poniżej podaję kod. Może ktoś pomóc z wprowadzeniem tego do mojego projektu? Najpierw pobieram dane z bazy zapytaniem 'SELECT * FROM ludzie' i dostaje wynik np 30 osob i jak zrobić podział np na 10 osób przypadające na jedną strone.

  1. <?php
  2. //Zapytanie do bazy danych,
  3. {
  4. $res = pg_query($conn, 'SELECT id, nazwisko, imie, id_stanowiska, nr_ewid
  5. FROM osoby_data WHERE time_del is NULL ORDER BY nazwisko, imie, id_stanowiska');
  6. }
  7. // Tabela
  8. {
  9. $count=pg_num_rows($res);
  10. print '<BR>';
  11. print '<center>';
  12. print '<TABLE BGCOLOR="#90C0F0" border="4" cellpadding="15" cellspacing="1">';
  13. print '<TR><TH colspan="5" scope="colgroup">Lista Osób</TH></TR>';
  14. print '<TH scope="col">Pełne Dane</TH>';
  15. print '<TH scope="col">Nazwisko</TH>';
  16. print '<TH scope="col">Imie</TH>';
  17. print '<TH scope="col">Stanowisko</TH>';
  18. print '<TH scope="col">Nr. Ewidencyjny</TH>';
  19. for ($x=0;$x<$count;$x++)
  20. {
  21.  
  22. // Tabela wraz z pobranymi danymi
  23.  
  24. print '<TR><td><A href="osoba.php?id='.pg_fetch_result($res,$x,'id').'">Szczegóły</A></td>';
  25. print '<td>'.pg_fetch_result($res,$x,'nazwisko').'</td>';
  26. print '<td>'.pg_fetch_result($res,$x,'imie').'</td>';
  27. print '<td>'.pg_fetch_result($res,$x,'id_stanowiska').'</td>';
  28. print '<td>'.pg_fetch_result($res,$x,'nr_ewid').'</td>';
  29. print '</tr>';
  30. }
  31. print '</table>';  
  32. print '</center>';
  33. }
  34. ?>
mdco
Piasłem na szybko i bez tesu, wiec mogłem sie gdzies pomylić. Ale generlanie masz moj zamysł na stronicowanie.
  1. <?php
  2. $ON_PAGE = 10; //liczba wyświetleń na stronie
  3.  
  4. $res = pg_query ($conn, 'SELECT COUNT(*) FROM osoby_data WHERE time_del is NULL');
  5. $all_records = pg_fetch_row ($res, 0); //wszystkie rekordy
  6. $num_all_pages = $all_records/$ON_PAGE //liczba stron
  7.  
  8. $start = $_GET['page'] * $ON_PAGE;  //poniżej jest nawigacja i zmienna $_GET['page']
  9.  
  10. //Zapytanie do bazy danych,
  11. {
  12. $res = pg_query($conn, 'SELECT id, nazwisko, imie, id_stanowiska, nr_ewid
  13. FROM osoby_data WHERE time_del is NULL ORDER BY nazwisko, imie, id_stanowiska LI
    MIT '
     . $start . ',' . $ON_PAGE);
  14. }
  15.  
  16. //Pasek nawigacji
  17. for($i=0; $i<$num_all_pages; $i++) {
  18. echo '<a href="script.php?page='.$i.'">'.$i.'</a> | ';
  19. }
  20.  
  21. // Tabela
  22. {
  23. $count=pg_num_rows($res);
  24. print '<BR>';
  25. print '<center>';
  26. print '<TABLE BGCOLOR="#90C0F0" border="4" cellpadding="15" cellspacing="1">';
  27. print '<TR><TH colspan="5" scope="colgroup">Lista Osób</TH></TR>';
  28. print '<TH scope="col">Pełne Dane</TH>';
  29. print '<TH scope="col">Nazwisko</TH>';
  30. print '<TH scope="col">Imie</TH>';
  31. print '<TH scope="col">Stanowisko</TH>';
  32. print '<TH scope="col">Nr. Ewidencyjny</TH>';
  33. for ($x=0;$x<$count;$x++)
  34. {
  35.  
  36. // Tabela wraz z pobranymi danymi
  37.  
  38. print '<TR><td><A href="osoba.php?id='.pg_fetch_result($res,$x,'id').'">Szczegóły</A></td>';
  39. print '<td>'.pg_fetch_result($res,$x,'nazwisko').'</td>';
  40. print '<td>'.pg_fetch_result($res,$x,'imie').'</td>';
  41. print '<td>'.pg_fetch_result($res,$x,'id_stanowiska').'</td>';
  42. print '<td>'.pg_fetch_result($res,$x,'nr_ewid').'</td>';
  43. print '</tr>';
  44. }
  45. print '</table>';  
  46. print '</center>';
  47. }
  48. ?>
Cysiaczek
Niom. od razu uprzedzę...
  1. <?php
  2. $num_all_pages = $all_records/$ON_PAGE //liczba stron
  3. ?>


Wypada chyba zaokrąglić w górę prawda? No ewentualnie niektórzy lubią takie bajery jak 13,33 strony wyników hehe. Solution - ceil()
dopy
Odgrzebałem na dysku rozwiązanie Dariusza Majgiera (algorytmy.pl):

  1. <?php
  2. function pasek($l_odp,$l_odp_nastronie,$l_odp_napasku,$skrypt,$a) {
  3. $l_odp_podz = intval($l_odp / $l_odp_nastronie);
  4. $l_odp_podz_mod = $l_odp % $l_odp_nastronie;
  5. if ($l_odp_podz_mod>0) $l_odp_podz++;
  6. if ($a<0) $a=0; 
  7. if ($a>=$l_odp_podz) $a=$l_odp_podz-1;
  8. $start = $a-1;
  9. if ($a>0) {$pop="<a href="".$skrypt."a=$start">&lt;&lt;&lt;
  10. poprzednia</a> - &nbsp;";}
  11. else {$pop = "<font color="gray">&lt;&lt;&lt; poprzednia </font> - &nbsp;";}
  12. if ($a<$l_odp_napasku) {$koniec = $l_odp_napasku*2+1;}
  13. else {$koniec = $a+$l_odp_napasku+1;}
  14. if ($a<=$koniec-$l_odp_napasku) {$star=$a-$l_odp_napasku;}
  15. if ($a>=$l_odp_podz-$l_odp_napasku) {$star=$l_odp_podz-$l_odp_napasku*2-1;}
  16. if ($koniec>$l_odp_podz) $koniec = $l_odp_podz;
  17. if ($star<0) $star=0;
  18. for ($i=$star; $i<$koniec; $i++) {
  19. if ($i <> $a) { $pasek .= "<a href="".$skrypt."a=$i">";}
  20. else { $pasek .= "<font color="red"><b>"; }
  21. if ($l_odp_podz<>1) {$pomocniczy = $i+1;}
  22. if ($i<>$a) { $pasek .= "$pomocniczy</a> &nbsp;"; }
  23. else {$pasek .= "$pomocniczy</b></font> &nbsp;";}
  24. }
  25. $dalej = $a+1;
  26. if ($a<$l_odp_podz-1) 
  27.  {$nas="- <a href="".$skrypt."a=$dalej">następna &gt;&gt;&gt; </a>";}
  28. else { $nas = "- <font color="gray">następna &gt;&gt;&gt; </font>";}
  29. if ($pomocniczy>0) {$br= "<br> $pop $pasek $nas"; }
  30. echo "<center> znalezionych: <b>$l_odp</b> na <b>$l_odp_podz</b> 
  31. stronach $br</center>";
  32. }
  33.  
  34. $l_odp_nastronie = 10;
  35. $l_odp_napasku = 5;
  36. $skrypt = "index.php?";
  37.  
  38. // połączenie z bazą
  39. $baza = mysql_connect("localhost", "admin", "admin");
  40. mysql_select_db("baza1");
  41.  
  42. // ustalenie ilości wszystkich rekordów spełniających warunek
  43. $wynik = mysql_fetch_array(mysql_query("SELECT COUNT(*) FROM ludzie"));
  44. $l_odp = $wynik[0];
  45.  
  46. // pobranie porcji informacji
  47. $a = $_GET["a"];
  48. $start = $a*$l_odp_nastronie;
  49. $wynik = mysql_query("SELECT * FROM ludzie LIMIT
  50. $start,$l_odp_nastronie");
  51. mysql_close($baza);
  52.  
  53. // pokazanie paska nawigacyjnego
  54. pasek($l_odp,$l_odp_nastronie,$l_odp_napasku,$skrypt,$a);
  55.  
  56. // wyświetlenie wyników z bazy danych
  57. $wierszy = mysql_num_rows($wynik);
  58. $pol = mysql_num_fields($wynik);
  59. for ($i=0;$i<$wierszy;$i++) {
  60. $wiersz = mysql_fetch_row($wynik);
  61. for ($j=0;$j<$pol;$j++) echo $wiersz[$j]." ";
  62. echo "<br />";
  63. }
  64. ?>
progman
mdco Wywala mi błąd przy:

  1. <?php
  2. $start = $_GET['page'] * $ON_PAGE;
  3. ?>


Co może być nie tak?
b_kostek
Witam
Mam rozwiązanie ale dla bazy MYSQL, moze się przyda:

  1. <?
  2. if($_GET[str] == "") {
  3. $str=0;
  4. } else {
  5. $str = $_GET[str];
  6. }
  7.  
  8. if($str > 0) {
  9. $str = $str * $wynikow_na_stronie;
  10. }
  11.  
  12.  
  13. $teraz = gmdate("Ymd") . gmdate("H") + 2 . gmdate ("is");
  14. $id = mysql_connect($host , $login, $haslo); 
  15. mysql_select_db($nazwa_bazy, $id);
  16.  
  17.  
  18. $query = "select * from $nazwa_tabeli where prywatny = 'nie' and wygasa > $teraz order by wygasa asc limit $str, $wynikow_na_stronie";
  19. $wynik = mysql_query($query);
  20. $query1 = "select * from $nazwa_tabeli where prywatny = 'nie' and wygasa > $teraz order by wygasa asc";
  21. $wynik1 = mysql_query($query1);
  22. $liczba_wynikow = mysql_num_rows($wynik1);
  23. }
  24.  
  25. while($wpis=mysql_fetch_assoc($wynik)) {
  26. include("szablony/szablon.php");
  27. }
  28.  
  29. ?>
  30.  
  31. <br>
  32. <center>
  33. Strona:<br>
  34. <?
  35. $liczba_wynikow = $liczba_wynikow / $wynikow_na_stronie;
  36. $liczba_stron = ceil($liczba_wynikow);
  37.  
  38. for($x=0; $x <= $liczba_stron-1; $x++) {
  39. if($x == $_GET[str]) {
  40. ?>
  41. <b><a href="?str=<? print $x; ?>">[<? print $x; ?>]</a> </b>
  42. <?
  43. } else {
  44. ?>
  45. <a href="?str=<? print $x; ?>">[<? print $x; ?>]</a> 
  46. <?
  47. }
  48. }
  49. ?>
  50.  
  51. </center>


Wygląda to tak jak na stronie
http://www.kostek.forall.pl/index.php?page=wszystkie&str=0
Nie śmiać się z wpisów tongue.gif To raczej prywatna strona biggrin.gif

Mam nadzieje ze się przyda
dopy
Cytat
ale dla bazy MYSQL

Heh, moje rozwiazanie tez jest dla bazy mySQL, ale mysle ze bardzo latwo zaimplementowac to w innych typach bazy.
progman
Zastosowałem poniższy kod ale efektów nie ma, wyświetla samą tabelkę ale już bez rekordów, nie mogę sobie z tym wogóle poradzić. Poprawi mi ktoś ten kod żeby działało stronnicowanie?

  1. <?php
  2. $conn = pg_connect("host=127.0.0.1 port=5432 dbname=osoby user=test password=test");
  3. if (!$conn) {echo "Nie udalo sie polaczyc z baza danych. n";
  4. exit;}
  5.  
  6. {
  7.  $ON_PAGE = 5; //liczba wyświetleń na stronie
  8.  $res = pg_query ($conn, 'SELECT COUNT(id) FROM ludzie');
  9.  $all_records = pg_fetch_row ($res, 0); //wszystkie rekordy
  10.  $num_all_pages = $all_records/$ON_PAGE; //liczba stron
  11.  $start = $_GET['page'] * $ON_PAGE;  //poniżej jest nawigacja i zmienna $_GET['page']
  12.  }
  13.  
  14. //Zapytanie do bazy danych,
  15. {
  16. $res = pg_query($conn, 'SELECT nazwisko, imie FROM ludzie LIMIT ' . $start . ',' . $ON_PAGE);
  17. }
  18.  
  19. //Pasek nawigacji
  20. for($i=0; $i<$num_all_pages; $i++)
  21.  {
  22. echo '<a href="index.php3?page='.$i.'">'.$i.'</a> | ';
  23. }
  24.  
  25.  // Tabela
  26. {
  27. $count=pg_num_rows($res);
  28. print '<BR>';
  29. print '<center>';
  30. print '<TABLE BGCOLOR="#90C0F0" border="4" cellpadding="15" cellspacing="1">';
  31. print '<TR><TH colspan="5" scope="colgroup">Lista Osób</TH></TR>';
  32. print '<TH scope="col">Nazwisko</TH>';
  33. print '<TH scope="col">Imie</TH>';
  34. for ($x=0;$x<$count;$x++)
  35. {
  36.  
  37. // Tabela wraz z pobranymi danymi
  38.  
  39. print '<TR><td>'.pg_fetch_result($res,$x,'nazwisko').'</td>';
  40. print '<td>'.pg_fetch_result($res,$x,'imie').'</td>';
  41. print '</tr>';
  42. }
  43. print '</table>';  
  44. print '</center>';
  45. }
  46. ?>


Dodam jeszcze że żaden kod niechce mi działać prawidłowo z podanych tutaj :/

mdco
Cytat(progman @ 9.07.2006, 09:47 ) *
mdco Wywala mi błąd przy:

  1. <?php
  2. $start = $_GET['page'] * $ON_PAGE;
  3. ?>


Co może być nie tak?


Jaki błąd Ci wywala? Być może wywala sie gdy zmienna $_GET['page'] nieistnieje?
Jeżeli tak to:
  1. <?php
  2. if( !isset($_GET['page']) )
  3. $_GET['page'] = 0;
  4.  
  5. $start = $_GET['page'] * $ON_PAGE;
  6. ?>
progman
Ok z tamtym sobie poradziłem już, mam inny problem związany ze stronnicowaniem, poniżej podaję kod zobaczcie co tam jest nie tak, bo ja się już zamotałem totalnie z tym stronnicowaniem winksmiley.jpg Sprawa jest taka że wszystko było by OK ale kiedy klikam na następną stronę to jest ok ale mogę tak klikać i klikać i strona cały czas idzie o 1 wyżej, druga sprawa to nie działa button ostatnia strona.

  1. <?php
  2. //ilosc rekordow na stronie
  3.  $na_stronie=7;
  4.  
  5.  //ilosc rekordow
  6.  $res1=pg_query($conn, 'SELECT count(id) as ilosc FROM ('.$tab_sql.') ddd');
  7.  $ilosc_rek=pg_result($res1, 0, 'ilosc');
  8.  
  9.  //biezaca strona
  10.  if (isset($HTTP_GET_VARS['pg']))
  11.  {
  12. $pg=$HTTP_GET_VARS['pg'];
  13.  }
  14.  else
  15.  {
  16. $pg=0;
  17.  }
  18.  
  19.  //rekordy dla biezacej strony
  20.  $res2=pg_query($conn, $tab_sql.' LIMIT '.$na_stronie.' OFFSET '.($pg * $na_stronie));
  21.  
  22.  if ($pg*$na_stronie>=$ilosc_rek)
  23.  {
  24. echo "Strona poza zakresem<br>";
  25.  }
  26.  else
  27.  {
  28. ?>


  1. <?php
  2. // pierwszy / npoprzedni / numer / następny / ostatni
  3. $plus = $pg+1;
  4.  
  5. if ($pg == 0)
  6. {
  7. echo " <img src='images/prev2.gif' alt='Poprzednia'/><img src='images/prev2.gif' alt='Poprzednia'/> <img src='images/prev.gif' alt='Poprzednia'/> ";
  8. } 
  9. else
  10. {
  11. echo " <a href='{$_SERVER['PHP_SELF']}?pg=0'><img src='images/prev2.gif' alt='Poprzednia'/><img src='images/prev2.gif' alt='Poprzednia'/></a> ";
  12. $prevpage = $pg-1;
  13. echo " <a href='{$_SERVER['PHP_SELF']}?pg=$prevpage'><img src='images/prev.gif' alt='Poprzednia'/></a> ";
  14. }
  15. echo " ( <B>Strona</B> $plus $lastpage ) ";
  16. if ($pg > $lastpage)
  17. {
  18. echo " <img src='images/next.gif' alt='Następna'/> <img src='images/next2.gif' alt='Następna'/><img src='images/next2.gif' alt='Następna'/> ";
  19. } 
  20. else 
  21. {
  22. $nextpage = $pg+1;
  23. echo " <a href='{$_SERVER['PHP_SELF']}?pg=$nextpage'><img src='images/next.gif' alt='Następna'/></a> ";
  24. echo " <a href='{$_SERVER['PHP_SELF']}?pg=$lastpage'><img src='images/next2.gif' alt='Następna'/><img src='images/next2.gif' alt='Następna'/></a> ";
  25. print '</center>';
  26. }
  27. ?>
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.