[PHP] Stronnicowanie wyników z bazy.

0

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.

//Zapytanie do bazy danych,
{
$res = pg_query($conn, 'SELECT id, nazwisko, imie, id_stanowiska, nr_ewid
FROM osoby_data WHERE time_del is NULL ORDER BY nazwisko, imie, id_stanowiska');
}
// Tabela
{
$count=pg_num_rows($res);
print '<BR>';
print '<center>';
print '<TABLE BGCOLOR="#90C0F0" border="4" cellpadding="15" cellspacing="1">';
print '<TR><TH colspan="5" scope="colgroup">Lista Osób</TH></TR>';
print '<TH scope="col">Pełne Dane</TH>';
print '<TH scope="col">Nazwisko</TH>';
print '<TH scope="col">Imie</TH>';
print '<TH scope="col">Stanowisko</TH>';
print '<TH scope="col">Nr. Ewidencyjny</TH>';
for ($x=0;$x<$count;$x++)
{

// Tabela wraz z pobranymi danymi

print '<TR><td><A href="osoba.php?id='.pg_fetch_result($res,$x,'id').'">Szczegóły</A></td>';
print '<td>'.pg_fetch_result($res,$x,'nazwisko').'</td>';
print '<td>'.pg_fetch_result($res,$x,'imie').'</td>';
print '<td>'.pg_fetch_result($res,$x,'id_stanowiska').'</td>';
print '<td>'.pg_fetch_result($res,$x,'nr_ewid').'</td>';
print '</tr>';
}
print '</table>';       
print '</center>';
}
0

SELECT * FROM ludzie LIMIT 0,10

Dla kolejnej strony zmieniasz wartości przy LIMIT.

0
nav napisał(a)

SELECT * FROM ludzie LIMIT 0,10

Dla kolejnej strony zmieniasz wartości przy LIMIT.

Tak, ale nie podzieli mi tego na strony tylko wyświetli sam wynik z LIMIT czyli tylko te 10 osób, mi chodzi żeby to wyglądało w ten sposób: "Pierwsza 1,2,3,4,5 Ostatnia" ;)

0

No to musisz już sobie napisać funkcję dzielącą na strony. Możesz wziąć takową choćby z Coyote czy phpbb.

0

spróbuj tego : http://forum.php.pl/index.php?showtopic=44313&hl=stronnicowanie :) sam z tego korzystam ;)

0

a przy malych ilosciach danych lub w przypadku gdy chcesz stronicowac dane NIE z sql'a lecz z inngo zrodla (zapisanego np w formie tablicy):
polecam array_chunk() ;)

0
nav napisał(a)

No to musisz już sobie napisać funkcję dzielącą na strony. Możesz wziąć takową choćby z Coyote czy phpbb.

dodam tylko, ze funkcja nazywa sie pagination

0
desperat napisał(a)

a przy malych ilosciach danych lub w przypadku gdy chcesz stronicowac dane NIE z sql'a lecz z inngo zrodla (zapisanego np w formie tablicy):
polecam array_chunk() ;)

przeciez dane z sql'a mozna zapisac w formie tablicy, wtedy funkcja zadziala :)

EDIT: jeszcze przydaloby sie sprecyzowac, co to znaczy "male ilosci". Mianowicie mysle, ze tablica wielkosci kilku tysiecy rekordow, nawet po srednio 0,1kB kazdy bedzie dzialala w niezauwazalnym czasie...

0
tomkiewicz napisał(a)

EDIT: jeszcze przydaloby sie sprecyzowac, co to znaczy "male ilosci". Mianowicie mysle, ze tablica wielkosci kilku tysiecy rekordow, nawet po srednio 0,1kB kazdy bedzie dzialala w niezauwazalnym czasie...
Heh, kilku tysiecy moze tak, ja pracuje z bazami ktore maja po okolo 500k rekordow minimum, a bazy niektore tabele zajmuja po 50MB ;]
Wyciagniecie wszystkich danych wiaze sie z automatycznym wysypaniem php'a (juz jak dostawal kolo 3MB z bazy to stawal deba [green]

poza tym jesli baza jest na tym samym serwerze co php, to nie ma problemu, jesli na innym, to wyciagniecie 50KB (jesli mielibysmy wyciagac wszystkie rekordy) to juz "troszke" zamula

Dlatego "male ilosci" to rzecz wzgledna :d

0

Sprawa jest dosc prosta. Jak juz wspomniano, wykorzstaj funkcje pagination() ktora wykorzystuje ten serwis. Znajdziesz ja na stronie cvs.4programmers.net w pliku functions.php. Pobierasz nastepujace wiersze tabeli, ale musisz rowniez wiedziec jaka jest ogolna ilosc wierszy w tabeli. Mozesz to zrobic przy pomocy osobnego zapytania:

SELECT COUNT(*) AS counter FROM `tabela`

W MySQL jest cos takiego jak SQL_CALC_FOUND_ROWS, ktore oblicza ilosc wierszy w tabeli:

SELECT SQL_CALC_FOUND_ROWS, kolumna1, kolumna2 FROM `tabela` LIMIT 10

Nastepnie:

SELECT FOUND_ROWS() AS result_count

zwraca ogolna ilosc wierszy tabeli.

0

Ciągle mam problem z rozdzieleniem wyników na strony, najlepiej by było jak bym wykorzystał do tego talice array, takie dostałem wskazówki. Pomóżcie bo jestem zdesperowany już :( Siedze cały czas nad tym i nie mogę sobie poradzić :/

Mam jeszcze następujące wskazówki:

LIMIT 50 OFFSET 0...X

pg_result($res, 0, 'ilosc');

ilosc rekordow[y]=x div 50
if x mod 50 > 0
then inc(y)
nr strony (0..y-1)

Zapytanie sprawdzające ilość rekordów podaję następująco:

('SELECT COUNT(id) AS ilosc from osoby_data');
0

Hmm... Znalazłem coś, może Ci się przyda: http://compzone.org/art-5-Podzial+rekordow+na+strony-10.html - na MySQL, ale z przerobieniem na Postgresa nie powinieneś mieć żadnych problemów

0

Witam ponownie ;-)

Zrobiłem tak jak napisał Coldpeer, przerobiłem kod pod postgresa ale nie pobiera mi żadnych rekordów :/ mam dwa pola, imie oraz nazwisko, nie wyświetla mi żadnych winików, kto pomoże rozgryść co jest nie tak? Poniżej kod przerobiony pod postgresa.

<?php
error_reporting(0);
$link = pg_connect("host=127.0.0.1 port=5432 dbname=osoby user=test password=test");
if (!$link) {echo "Nie udalo sie polaczyc z baza danych. \n";
              exit;}
{
      //Domyślne wartości, odpowiednio liczby rekordów na strone i przesunięcia
      $count=5;
      $offset=0;
  }
     {


                //Pobranie danych z $_GET jezsli ustawione
   if(isset($_GET['count']))$count = $_GET['count'];
    if(isset($_GET['offset']))$offset = $count*$_GET['offset']; //numer strony
              //Pobranie liczby rekordów
              $sql = pg_query($link, 'SELECT COUNT(*) FROM ludzie');
              $result = pg_query($sql);
              $r = pg_fetch_array($result);
              //Liczba stron, użycie ceil - zaokrąglenie w górę, w celu zapewnienia, że żadna strona się nie straci
              $pages = ceil($r[0]/$count);

               //Pobranie odpowieniej paczki
               $sql = pg_query($link, 'SELECT * FROM ludzie Limit '.$count.' offset '.$offset.';');
               $result = pg_query($sql,$link);

               // Tu zaczyna sie tabelka =]
               echo '<center><table><tr><th>Nazwisko</th><th>Imie</th></tr></center>';

               //Pętla po wszystkich rekordach
               while(($row=pg_fetch_array($result))!=NULL){
               echo '<tr><td>'.$row['nazwisko'].'</td><td>'.$row['imie']. '</td></tr>';
               }
               echo '</table>'; }

                //Pętla po stronach
                for($i=0;$i<$pages;$i++){
                //jeśli obecna strona, nie twórz linku do strony
                if($i*$count==$offset){
                echo ' '.$i.' ';
                }else{
                echo '<a href="index.php?count='.$count.'&offset='.$i.'"> '.$i.' </a>';
                }
                 }
?>

1 użytkowników online, w tym zalogowanych: 0, gości: 1