PHP - Stronicowanie wyników wyszukiwania

0

Witam,

wyobraźmy sobie taką sytuację. Wyszukuję dane z bazy - załóżmy że w wyniku wyszukiwania otrzymałem 50 rekordów. Chcę teraz wyświetlać te rekordy na 5 stronach - po 10 na stronę.

No i tutaj zaczynają się schody - jak to zrobić? Mam dwa wyjścia: albo użyć LIMIT w zapytaniu, albo nie używać tego i potem tylko wyświetlać odpowiedni zakres z wyszukanych danych.

Jednak nie wiem jak z tego wybrnąć.

Jeżeli używam LIMIT, to problemem jest ilość zwróconych wyników - nie mogę przewidzieć ile wyników zwróci zapytanie. Próbowałem kombinować coś z COUNT ale zwraca tablicę danych i nie mogę wyciągnąć jednoznacznie ilości danych. Poza tym w takim wypadku trzeba by bylo wykonywac zapytanie do bazy po kliknięciu w każdy numer strony, co mogłoby długo trwać...

Jeżeli nie chcę używać LIMIT to wychodzi jeszcze gorzej. Załóżmy, że wykonałem zapytanie do bazy. Jednak klikając w odnośniki do kolejnych stron znów wysyłam zapytanie do bazy - ponieważ wykonanie zapytania trwa u mnie dość długo, jest to bez sensu. Oczywiście to nie problem zrobić, żeby po kliknięciu w link zapytanie nie szło drugi raz, ale gdzie wtedy zapamiętać wyniki zwrócone poprzednio z bazy?

0

Sposób nie mój... ale stosuje go gdzie moge....
na http://www.flatplanet.pl/?pid=portfolio ten kod jest odpowiedzialny za stronnicowanie.

$query="SELECT * FROM portfolio WHERE visible='1' ORDER BY chrono DESC";
echo '<div  class="tresc" style="text-align:right;">';
  
  $sql_num=mysql_query($query);
  $ile=mysql_num_rows($sql_num);
  $limit=10;// ilosc linkow 
  $limit_linkow=3;//ile wynikow na stronie
  $count=ceil($ile/$limit_linkow); 
  $page = (isset($_GET['page'])) ? (int)$_GET['page'] : 1; 
  if (($page < 1) || ($page > $count)) $page = 1; 
  
  if ($count > $limit) { 
  
  $start = $page - floor($limit / 2); 
  if ($start < 1) $start = 1; 
  
  $end = $start + $limit - 1; 
  if ($end > $count) { 
    $end = $count; 
    $start = $end - $limit; 
  } 
    
  } else { 
    $start = 1; 
    $end = $count; 
  } 
    
  $pgback = $page - 1; 
  $pgnext = $page + 1; 
    
  if ($page >1) echo"<a href=\"?pid=portfolio&amp;page=$pgback\"><< poprzednia</a>"; 
  for ($x=$start;$x<=$end;$x++) { 
    
    if ($x != $page) { 
     $t = $x; 
  
     echo " <a href=\"?pid=portfolio&amp;page=$x\">$t</a>\n "; 
    } else echo " <b>[$x]</b> "; 
    
  } 
  if ($page < $count) echo"<a href=\"?pid=portfolio&amp;page=$pgnext\">nastepna >></a>\n"; 
  $start = $page * $limit_linkow-$limit_linkow;
  $query_page=$query." limit $start,$limit_linkow";
  $result=mysql_query($query_page);
  echo "</div>";
0

Dzieki, to jest to. Chociaz znow zapytanie po kliknieciu na kazda strone..

Ale mam teraz jeszcze inny problem. Warunki zapytania pochodza z forumularza wyszukiwania i sa przesylane za pomoca POST. Problem w tym, ze po kliknieciu na nastepna strone dane te sa tracone i wyszukiwanie idzie juz bez zadnych warunków czyli zwracana jest zawartość całej tabeli.

Co z tym zrobic? Nie mam pomyslu za bardzo

[edit]
Jednak z tym skryptem jest cos nie tak, sypie sie jezeli zmienie $limit lub $limit_linkow - nie mam juz teraz sil aby go analizowac, ale jeszcze sie przyjrze

0

sesja? a i wyniki wyszukiwania możesz jakoś cache'ować, ale na moją głowę, to za wiele nie stracisz używając tego kodu, co flatplanel podał.

0

Albo przekazuj warunki wyszukiwania w GET - jest o tyle lepsze, ze mozna komus przekleic linka.

Czyli zamiast dawac link do kolejnej strony np. www....?strona=3 dajesz wszystkie informacje, ktore potrzebne sa, zeby znowu wyszukac, czyli www...?gdzie=aaa&warunek=bbb&jesliC=ccc&strona=3

No chyba, ze wyszukiwanie zajmuje straaasznie duzo czasu - wtedy ja raczej staralbym sie je przyspieszyc, niz sciagac wszystkie wyniki. Glownie dlatego, ze wynikow moze byc po prostu duzo. Zazwyczaj bardziej oplaca sie zapytac baze o kolejna serie wynikow, niz sciagac wszystkie.

0

Ok, czyli w takim razie i w formularzu wyszukiwania musze dac GET zamiast POST. Tylko ze w takim wypadku znowu jest nie tak jak powinno byc, bo jezeli teraz w formularzu dam action="?bleble" to mi nadpisuje linka.

Czyli idzie mi o to, ze wtedy forularz nie "wypluwa" nic a zostaje tylko to co dalem w action. Czyli z formularza nic nie jest przekazywane metoda GET. A w action musze dac, bo musze przekazac jeszcze inne parametry oprocz warunkow wyszukiwania z formularza.

0

rozwiązanie jest bardzo proste (nie wiem czy działa to w mysql'u, w postgresie na pewno):

robisz select from tabela limit 10 offset 0
później: select from tabela limit 10 offset 10
select from tabela limit 10 offset 20
itd.
w get przekazujesz tylko wartość offset'a.

0

No dzialaja offsety ale nie wiem w jaki sposob pomoze to rozwiazac moj problem. Niewazne czy limit podaje jako offset, czy nie. Wazne ze w GET musze przekazac takze warunki wyszukiwania bo inaczej je strace po odswiezeniu strony.

Jak to zrobic?

0

ojjj ojj, jak to ludzie sobie życie lubią utrudniać :P

SQL:

SELECT SQL_CALC_FOUND_ROWS pola FROM tabela LIMIT start,ilenastrone;
SELECT FOUND_ROWS();

a do htacces:php_flag mysql.trace_mode off

inne rozwiązanie - wyniki zapisuj w sesji (ale podobno baza jest wydajniejsza niż pliki tekstowe ;))

edit: parametry filtra (bo chyba o to chodzi?) też zapisuj w sesji

0

No ale jak nic nie jest przekazywane metodą GET ?! Nie rozumiem, przecież to, o czym piszesz, działa zupełnie poprawnie :|

Swoją drogą, GET jest faktycznie dużo lepszym pomysłem niż sesja, czemu mi sesja pierwsza przyszła do głowy, to nie mam pojęcia :P

0

No wlasnie nie wiem, ale chyba w GET nie jest nic przekazywane - ok wytlumacze dokladniej o co mi chodzi.

Mam forumularz, z polem nazwa. Jezeli w form action nie dam nic to jest ok - wtedy po wcisnieciu submit zawartosc tego pola jest doklejana do linka i moge skorzystac ze zmiennej $_GET zeby to wyciagnac.

Ale ja chce, oprocz automatycznego przekazania zawartosci pol formularza dokleic do linka jeszcze kilka innych zmiennych - nie pochodza one z forumularza ale chce je przekazac. Wiec w form action daje ?zmienna=wartosc. Ale jezeli to zrobie to po wcisnieciu submit w linku jest TYLKO ?zmienna=wartosc. W zmiennej $_GET nie ma juz wartosci pol formularza, tak jak przedtem i nie ma ich w linku.

Mam nadzieje ze dobrze to wyjasnilem - byc moze trzeba co innego dac w form action zeby nie nadpisaalo mi tego linka tylko dodalo jeszcze moje zmienne do niego? Jak to zrobic?

0

dodaj pola hidden do forma

0
Sasik napisał(a)

Swoją drogą, GET jest faktycznie dużo lepszym pomysłem niż sesja, czemu mi sesja pierwsza przyszła do głowy, to nie mam pojęcia :P

zależy, co chcesz uzyskać - jeżeli ważne są ładne URL, porządek w google (brak podwójnych wpisów), ale niekoniecznie możliwość przekazania sortu wraz z linkiem, lepsze będą sesje

0

OK chyba wiem juz wszystko - zrobie to na GET i zobacze co mi z tego wyjdzie.. Jedyny problem to dluugie odpowiedzi na zapytania do bazy (rzędu kilkunastu sekund) :/

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