Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: problem ze stronicowaniem
Forum PHP.pl > Forum > Przedszkole
peklo
mam taki mały problemik ze stronicowaniem wyników.
Jak wcisne szukaj to stronicuje mi ok. Pokazuje wszystkie rekordy i dzieli ładnie na strony np:
27 rekordów po 5 na stronie czyli pokazuje 1 strona z 6. Jeślii wezme wybiorę warunki wyszukiwania również jest wszystko ok.
Problem pojawia się jak wciisnę warunki wyszukiwania dla drugiej tabeli.
Przykład:
Zaznacze prawo jazdy 1 i 2 pokazuje mi ładnie 6 wyników, a stronicowanie 1 strona z 5
lub
zaznacze pj 1 pokazuje 8 rekordów , a stronicowanie 1 z 3 stron.
Zapytanie odpowiedzialne za stronicowanie-nie do końca działa ok

  1. $sql="SELECT count(*) as `ile` FROM ogloszenia o WHERE ". implode( ' AND ', $where ) ;
  2. if(!empty($formData['id_prawo_jazdy']))
  3. $sql="SELECT count(*) as `ile` FROM ogloszenia o LEFT OUTER JOIN pj p on o.id=p.id_ogloszenia WHERE ". implode( ' AND ', $where )."";
  4. $row = $stmt=$pdo->prepare($sql);
  5. $row = $stmt->execute( $bind );
  6. $row = $stmt->fetch();
  7. $recordsCount = $row['ile'];



i skrypt z zapytania które jest ok, a słuzy do wyswietlania wyników
  1. $sql="SELECT o.miasto,o.id_kraj,o.id_wojewodztwo,o.wyroznione,o.aktywne,o.id,o.za,o.cena,o.id
    _kategoria,o.data_dod,o.nazwa_ogloszenia,o.czas,
  2. z.id_ogloszenia,z.thumb,z.uploads,z.im,p.id_ogloszenia,p.id_prawo_jazdy FROM ogloszenia o LEFT OUTER JOIN zdjecia z on o.id=z.id_ogloszenia LEFT OUTER JOIN pj p on o.id=p.id_ogloszenia
  3. WHERE ". implode( ' AND ', $where);
  4. if(!empty($formData['id_prawo_jazdy']))
  5. $sql.=" and o.id not in (select o2.id from ogloszenia as o2,pj as p2 where o2.id=p2.id_ogloszenia AND p2.id_prawo_jazdy in(".implode(',',$idpj_all)."))
  6. group by o.id having count(o.id)=".count($where_idpj)." order by o.wyroznione DESC,o.id DESC limit ".$start.",".($end - $start + 1);
  7. else
  8. $sql.=" group by o.id order by o.wyroznione DESC,o.id DESC limit ".$start.",".($end - $start + 1);
  9. $stmt=$pdo->prepare($sql);
  10. $stmt->execute( $bind );
nospor
Problem z mysql nie ma wiekszego zwiazku. Przenosze.

Juz ci poza tym tlumaczylem kilkukrotnie, ze zapytanie do zliczania rekordow ma byc takie samo co zapytanie do wyswietlania rekordow, gdyz w przeciwnym wypadku bedą przeklamane dane.... ale jak zwykle w ogole mnie nie sluchasz...
peklo
no to tak robiłem i klapa. kombinowałem na wszelkie sposoby i nic sad.gif
nospor
W kodzie co tu pokazales raczej nie widac bys tak wlasnie zrobil. Jak dla mnie zapytanie do zliczania jest rozne od zapytania do wyswietlania.
peklo
tak bo to zapytanie działa mi najlepiej z posród tych które zkleiłem wcześniej smile.gif. Nospor ja Cię zawsze słucham smile.gif

jak wezmę to samo zapytanie co do wyświetlania wyników to wyświetla mi 1 wynik. Jak wykasuje grupowanie tj jeszcze gorzej niż w pierwszym zapytaniu na poczatku postu
trueblue
  1. $sql="SELECT count(*) FROM ogloszenia o LEFT OUTER JOIN zdjecia z on o.id=z.id_ogloszenia LEFT OUTER JOIN pj p on o.id=p.id_ogloszenia
  2. WHERE ". implode( ' AND ', $where);
  3. if(!empty($formData['id_prawo_jazdy']))
  4. $sql.=" and o.id not in (select o2.id from ogloszenia as o2,pj as p2 where o2.id=p2.id_ogloszenia AND p2.id_prawo_jazdy in(".implode(',',$idpj_all)."))
  5. group by o.id having count(o.id)=".count($where_idpj);
  6. else
  7. $sql.=" group by o.id";
peklo
tak już próbowałem wcześnie Trueblue i na stornie pokazuje tylko 1 wynik
jak usuwam group to znowu mam w ciul stron 1 z np 20
trueblue
A jak pobierasz z tego zapytania ilość wszystkich rekordów?
peklo
jak pobieram wszystkie rekordy tj ok tym zapytaniem

  1. $sql="SELECT count(*) FROM ogloszenia o LEFT OUTER JOIN zdjecia z on o.id=z.id_ogloszenia LEFT OUTER JOIN pj p on o.id=p.id_ogloszenia WHERE ". implode( ' AND ', $where);


Jak wezme szukaj z zaznaczonymi opcjami w tabeli głownej to tez jest ok. Dopiero jak dołącze te prawo jazdy to sie krzaczy
trueblue
Chciałem abyś pokazał jakim kodem pobierasz z zapytania, które Ci podałem ilość wszystkich rekordów.
peklo
  1. $idpj_all=array(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15);
  2. if (!empty($formData['id_prawo_jazdy']))
  3. {
  4. $where_idpj=array();
  5. $i=0;
  6. foreach($formData['id_prawo_jazdy'] as $idpj){
  7. $where_idpj[]=':id_prawo_jazdy_'.$i;
  8. $bind[':id_prawo_jazdy_'.$i++]=$idpj;
  9. $idpj_all=array_diff($idpj_all,array($idpj));
  10. }
  11. $where[] = 'id_prawo_jazdy IN('.implode(',',$where_idpj).')';
  12. }


a i jeszcze
  1.  
  2. $bind = array(
  3. ':aktywne' => 1,
  4. ':id_kategoria' => 1,
  5. );
  6.  
  7. $where = array(
  8. 'aktywne = :aktywne',
  9. 'id_kategoria = :id_kategoria'
  10. );
trueblue
A jak z zapytania, które Ci podałem pobierasz wartość?
Zapytanie to zwraca jeden rekord z jednym polem, i jest to liczba wszystkich rekordów, które spełniają podane warunki.

Obecnie pokazujesz mi jak budujesz warunki do tego zapytania.
Pokaż co robisz gdy je uruchomisz.
peklo
tj pager autorstwa nospor, a wygląda mniej więcej tak

  1. $row = $stmt=$pdo->prepare($sql);
  2. $row = $stmt->execute( $bind );
  3. $row = $stmt->fetch();
  4. $recordsCount = $row['ile'];
  5. try{
  6. $pager = new Pager('idPagera', null);
  7. $pager->SetTotalRecords($recordsCount);
  8. $pager->Make(true);
  9. $pag = $pager->Render();
  10. $start = $pager->GetIndexRecordStart();
  11. $end = $pager->GetIndexRecordEnd();
  12. }
  13. catch (Exception $e) {
  14. echo $e->getMessage();
  15. }


kodu pagera raczej nie bede wklejać http://nospor.pl/download/idfolder/20/

i wyświetlenie ilosci stron
  1. echo 'Strona '.$pager->GetActualPage().' z '.$pager->GetTotalPages();
  2. echo $pag;
trueblue
Spróbuj tak:
  1. $stmt=$pdo->prepare($sql);
  2. $stmt->execute( $bind );
  3. $recordsCount =$stmt->fetchColumn(0);
  4. echo "wszytkich rekordow=".$recordsCount; //pokaz wynik tego
  5. try{
peklo
wszytkich rekordow=18
trueblue
I z takim kodem (już bez tego echo) nie działa stronicowanie?
peklo
działa stronicowanie ale tylko dla warunkóww wyszukiwania z tabeli głownej. Jak zaznacze przykladowo 1 checkbox pj to pokazuje tylko 1 rekord
trueblue
A co pokazuje powyższe echo kiedy zaznaczysz ten jeden checkbox?
peklo
wszytkich rekordow=1
nospor
Pozwole sobie się znowu wtrącić:
Jesli dodajecie do zapytania GROUP BY to wowczas
select COUNT(*)
nie działa już tak samo jak bez GROUP BY smile.gif
trueblue
Oczywiście, że masz rację nospor.

count(distinct o.id) zamiast count(*) i bez group by o.id

peklo
całe zapytanie mam teraz tak lecz źle wyszukuje z zaznaczeniem prawa jazdy (1 rekord)
  1. $sql="SELECT count(distinct o.id) FROM ogloszenia o LEFT OUTER JOIN zdjecia z on o.id=z.id_ogloszenia LEFT OUTER JOIN pj p on o.id=p.id_ogloszenia
  2. WHERE ". implode( ' AND ', $where);
  3. if(!empty($formData['id_prawo_jazdy']))
  4. $sql.=" and o.id not in (select o2.id from ogloszenia as o2,pj as p2 where o2.id=p2.id_ogloszenia AND p2.id_prawo_jazdy in(".implode(',',$idpj_all).")) having count(o.id)=".count($where_idpj);
  5.  
  6. $stmt=$pdo->prepare($sql);
  7. $stmt->execute( $bind );
  8. $recordsCount =$stmt->fetchColumn(0);
  9.  
  10. try{
trueblue
Nic to nie zmieni.
Zostało GROUP BY, ale usunięcie GROUP BY musi skutkować usunięciem HAVING.
Zapytanie jest do przeróbki.

Lub mała podpowiedź dla Ciebie: http://dev.mysql.com/doc/refman/5.0/en/inf...tion_found-rows
Nie musisz dla powyższego tworzyć odrębnego zapytania zliczającego wszystkie rekordy. Umieszczasz to w zapytaniu, które ma wbudowany LIMIT.
peklo
niby juz wszystko działa z jednym wyjątkiem. Jak zaznaczę dwa lub więcej checkbox to pokazuje mi więcej stron
  1. $sql="SELECT count(distinct o.id) FROM ogloszenia o LEFT OUTER JOIN zdjecia z on o.id=z.id_ogloszenia LEFT OUTER JOIN pj p on o.id=p.id_ogloszenia
  2. WHERE ". implode( ' AND ', $where);
  3. if(!empty($formData['id_prawo_jazdy']))
  4. $sql.=" and o.id not in (select o2.id from ogloszenia as o2,pj as p2 where o2.id=p2.id_ogloszenia AND p2.id_prawo_jazdy in(".implode(',',$idpj_all)."))";
  5. $stmt=$pdo->prepare($sql);
  6. $stmt->execute( $bind );
  7. $recordsCount =$stmt->fetchColumn(0);


lub nie pokazuje rekordów, a dzieli strony

ponadto po zaznaczeniu wszystkich checkbox wywala błąd

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '))' at line 2' in /home/cxr86679/public_html/:126 Stack trace: #0 /home/cxr86679/public_html/(126): PDOStatement->execute(Array) #1 {main} thrown in /home/cxr86679/public_html/ on line 126
coś chyba w tym jest namieszane
$sql.=" and o.id not in (select o2.id from ogloszenia as o2,pj as p2 where o2.id=p2.id_ogloszenia AND p2.id_prawo_jazdy in(".implode(',',$idpj_all)."))";
trueblue
Ok, ale nie chodziło o przebudowanie na zasadzie wyrzucenia GROUP BY wraz z HAVING.

Spróbuj rozwiązania które podałem Ci w mojej poprzedniej wiadomości.
peklo
dobra może i nospor ma rację odnosnie zakładania nowego tematu ale zmieniło mi sie troszke zapytanie. ok to zaczne pisac tutaj.
Twoje rozwiązanie nospor o którym mowiłeś, że zapytanie ma być takie samo do stronicowania jak i wyświetlania wyników w ogóle nie działa. W moim przypadku działało jak miałem jedna tabele ale jak ja połączyłem w zapytaniu z inną to stronicowanie juz mi nie działa poprawnie
nospor
Nie chodzilo o dołączenie drugiej tabeli, tylko o stosowanie group by. Wyjasnialem to w jednym z postow tutaj.
peklo
chyba najlepiej będzie jak wkleje to zapytanie które mam do wyświetlania wyników i już
Do stronicowania wyników mam teraz coś takiego i owszem może i dobrze stronicuje ale chyba chodzi o group by bo pokazuje mi 1 rekord

  1. $sql="SELECT count(distinct o.id) FROM ogloszenia o LEFT OUTER JOIN pj p on o.id=p.id_ogloszenia
  2. WHERE ". implode( ' AND ', $where);
  3. if(!empty($formData['id_prawo_jazdy']) && count($idpj_all))
  4. $sql.=" and o.id not in (select o2.id from ogloszenia as o2,pj as p2 where o2.id=p2.id_ogloszenia AND p2.id_prawo_jazdy in(".implode(',',$idpj_all)."))
  5. group by o.id having count(o.id)=".count($where_idpj)." order by o.wyroznione DESC,o.id DESC";
  6. elseif(!empty($formData['id_prawo_jazdy']))
  7. $sql.=" group by o.id having count(o.id)=".count($where_idpj)." order by o.wyroznione DESC,o.id DESC";
  8. else
  9. $sql.=" group by o.id order by o.wyroznione DESC,o.id DESC";


i jeszcze warunek do prawa jazdy
  1. $idpj_all=array(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15);
  2.  
  3. if (!empty($formData['id_prawo_jazdy']))
  4. {
  5. $where_idpj=array();
  6. $i=0;
  7. foreach($formData['id_prawo_jazdy'] as $idpj){
  8. $where_idpj[]=':id_prawo_jazdy_'.$i;
  9. $bind[':id_prawo_jazdy_'.$i++]=$idpj;
  10. $idpj_all=array_diff($idpj_all,array($idpj));
  11. }
  12. $where[] = 'id_prawo_jazdy IN('.implode(',',$where_idpj).')';
  13. }


jak wyrzuce group by to pokazuje rekordy ale cos znowu przekłamuje ze stronicowaniem
Crozin
Do stronicowania obiektów posiadających relację jeden-do-wielu lub wiele-do-wielu musimy wykonać do trzech zapytań:
1. Zliczające łączą ilość obiektów, jakie będziemy wyświetlać wykorzystujące COUNT(DISTINCT id) czy coś podobnego. Możemy je ewentualnie pominąć, jeżeli łączną ilość obiektów mamy już gdzieś zapisaną - częste np. przy komentarzach, gdzie ich łączną ilość i tak mamy zapisaną w tabeli z postami/obrazami/czymkolwiek co da się komentować. Dla MySQL:
  1. SELECT COUNT(DISTINCT t.id) FROM tbl_name t [WHERE ... [GROUP BY ... [HAVING ...]]]
Klauzule WHERE, GROUP BY itp. powinny być identyczne jak w zapytaniu z punktu drugiego.
2. Wybierające unikalne ID rekordów, które przypadają na daną stronę - to tutaj lądują obowiązkowo klauzule ORDER BY ... oraz OFFSET ... LIMIT ....
3. Wybierające faktyczne obiekty z bazy danych. Tutaj modyfikujemy klauzulę WHERE:
  1. WHERE t.id IN(...)
oraz usuwamy klauzulę OFFSET ... LIMIT ....

Bardzo istotne jest by drugie i trzecie zapytanie miały obowiązkowo klauzurę ORDER BY.
peklo
czyli jedno zapytanie już mam które działa mi dobrze heh

  1. $sql="SELECT COUNT(DISTINCT o.id) FROM ogloszenia o WHERE ". implode( ' AND ', $where)."";
nospor
Jkabys mial dobrze, to by ci poprawnie stronicowalo wink.gif

@Crozin nie jestes w kontekscie problemu i tutaj naprawde nie o to chodzi smile.gif
peklo
witam ponownie
Już mi ręce opadaja z tym stronicowaniem. Poprostu wkleje to co mam i mam nadzieje że ktoś miał podobny problem i mi pomoże

  1. $where = array(
  2. 'aktywne = :aktywne',
  3. 'id_kategoria = :id_kategoria'
  4. );
  5. $idpj_all=array(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15);
  6.  
  7. if (!empty($formData['id_prawo_jazdy']))
  8. {
  9. $where_idpj=array();
  10. $i=0;
  11. foreach($formData['id_prawo_jazdy'] as $idpj){
  12. $where_idpj[]=':id_prawo_jazdy_'.$i;
  13. $bind[':id_prawo_jazdy_'.$i++]=$idpj;
  14. $idpj_all=array_diff($idpj_all,array($idpj));
  15. }
  16. $where[] = 'id_prawo_jazdy IN('.implode(',',$where_idpj).')';
  17. }
  18. require_once('pager.class.php');
  19. //I TU MAM WŁAŚNIE PROBLEM Z TYM ZAPYTANIEM
  20. //mam takie zapytanie do stronicowania. Jak zaznaczę więcej jak jeden checkbox źle stronicuje (pokazuje więcej stron niż jest potrzebne) lecz wyswietla wyszukane rekordy OK
  21. $sql="SELECT count(distinct o.id) FROM ogloszenia o LEFT OUTER JOIN pj p on o.id=p.id_ogloszenia WHERE ". implode( ' AND ', $where);
  22. if(!empty($formData['id_prawo_jazdy']) && count($idpj_all))
  23. $sql.=" and o.id not in (select o2.id from ogloszenia as o2,pj as p2 where o2.id=p2.id_ogloszenia AND p2.id_prawo_jazdy in(".implode(',',$idpj_all)."))";
  24.  
  25. $stmt=$pdo->prepare($sql);
  26. $stmt->execute( $bind );
  27. $recordsCount =$stmt->fetchColumn(0);
  28.  
  29. try{
  30. $pager = new Pager('idPagera', null);
  31. $pager->SetTotalRecords($recordsCount);
  32. $pager->Make(true);
  33. $pag = $pager->Render();
  34. $start = $pager->GetIndexRecordStart();
  35. $end = $pager->GetIndexRecordEnd();
  36. }
  37. catch (Exception $e) {
  38. echo $e->getMessage();
  39. }
  40.  
  41. //i tutaj zapytanie do wyswietlenia wyników. Działa i wyświetla wyszukane rekordy OK.
  42.  
  43. $sql="SELECT o.miasto,o.id_kraj,o.id_wojewodztwo,p.id_ogloszenia,p.id_prawo_jazdy FROM ogloszenia o LEFT OUTER JOIN pj p on o.id=p.id_ogloszenia
  44. WHERE ". implode( ' AND ', $where);
  45. if(!empty($formData['id_prawo_jazdy']) && count($idpj_all))
  46. $sql.=" and o.id not in (select o2.id from ogloszenia as o2,pj as p2 where o2.id=p2.id_ogloszenia AND p2.id_prawo_jazdy in(".implode(',',$idpj_all)."))
  47. group by o.id having count(o.id)=".count($where_idpj)." order by o.wyroznione DESC,o.id DESC limit ".$start.",".($end - $start + 1);
  48. elseif(!empty($formData['id_prawo_jazdy']))
  49. $sql.=" group by o.id having count(o.id)=".count($where_idpj)." order by o.wyroznione DESC,o.id DESC limit ".$start.",".($end - $start + 1);
  50. else
  51. $sql.=" group by o.id order by o.wyroznione DESC,o.id DESC limit ".$start.",".($end - $start + 1);
nospor
Problem nie jest ze skryptem stronicowania, tylko z zapytaniem pobierającym liczbę wszystkich rekordów. Błędny wynik tego zapytania psuje wszystko inne. Staraj się uścislać problem wink.gif

Skoro masz taki problem z tym zapytaniem, to rekordy policz przez podzapytanie czyli:

  1. $sql = 'Tutaj twoje normalne zapytanie do wyszukiwania wyników';
  2. //i teraz budujesz zapytanie na liczbę rekordów
  3. $sqlCount = 'select count(*) from ('.$sql.') podsel';

Nie jest to może najoptymalniejsze, ale lepsze niz nic wink.gif
peklo
Ja wiem że problem nie jest z pagerem tylko z moim zapytaniem do stronicowania. Ok więc jest tak:

-jesli nie zaznaczę żadnych kryteriów wyszukiwania tylko warunek where aktywne=1 i id_kategoria=1 to stronicuje i wyswietla OK
- jesli wybiore jakieśs kryteria + np 1 checkbox równiez jest wszystko OK - stronicuje i wyświetla dobrze)
- jeśli natomiast zaznaczę 2 lub więcej checkbox lub wszystkie wówczas pokazuje rekordy dobrze wg żądanych kryteriów lecz przekłamuje ze stronicowaniem. Pokazuje więcej stron niż potrzeba.
nospor
PIsales to juz wielokrotnie. Po co powtarzasz? Podalem ci najmniej problemowe rozwiązanie.
peklo
zmieniłem zapytanie i teraz mi dobrze stronicuje ale pokazuje po jednym rekordzie sad.gif
  1. $sql="SELECT sql_calc_found_rows o.miasto,o.id_kraj,o.id_wojewodztwo,p.id_ogloszenia,p.id_prawo_jazdy FROM ogloszenia o LEFT OUTER JOIN pj p on o.id=p.id_ogloszenia
  2. WHERE ". implode( ' AND ', $where);
  3. if(!empty($formData['id_prawo_jazdy']) && count($idpj_all))
  4. $sql.=" and o.id not in (select o2.id from ogloszenia as o2,pj as p2 where o2.id=p2.id_ogloszenia AND p2.id_prawo_jazdy in(".implode(',',$idpj_all)."))
  5. group by o.id having count(o.id)=".count($where_idpj)." order by o.wyroznione DESC,o.id DESC limit ".$start.",".($end - $start + 1);
  6. elseif(!empty($formData['id_prawo_jazdy']))
  7. $sql.=" group by o.id having count(o.id)=".count($where_idpj)." order by o.wyroznione DESC,o.id DESC limit ".$start.",".($end - $start + 1);
  8. else
  9. $sql.=" group by o.id order by o.wyroznione DESC,o.id DESC limit ".$start.",".($end - $start + 1);
  10.  
  11. $stmt=$pdo->prepare($sql);
  12. $stmt->execute( $bind );
  13. echo $sql;
  14.  
  15. while($ogloszenia = $stmt -> fetch())
  16. {
  17. //tabela
  18. }
  19. $stmt -> closeCursor();
  20. }
  21. catch(PDOException $e)
  22. {
  23. print "Błąd!: " . $e->getMessage() . "<br/>";
  24.  
  25. }
  26.  
  27.  
  28. $sql = "select found_rows()";
  29. $stmt = $pdo->query($sql);
  30. $recordsCount = $stmt->fetchColumn(0);


Jak pusciłem echo $sql to nie wiem czemu ale mam limit 0,1, a w pager mam ustawiony limit 5
nospor
Zamien
limit ".$start.",".($end - $start + 1);
na:
limit ".$start.",5";

Jesli to nie pomoze, pokaz caly kod po zmianach, wlacznie z inicjalizacją pagera
peklo
cześć nospor
Sory za maila ale juz nie wytrzymuje z tym zapytaniem
Teraz pokazuje mi po 5 na stronie ale jak przerzuce na następną mam te same rekordy. Zaraz wkleje całość

oto kod. Tylko muszę dwa razy inicjować pagera bo jak dam go tylko na samym końcu to wtedy nie działa mi warunek do stronicowaniaten z limit
  1. <?php
  2. $where = array(
  3. 'aktywne = :aktywne',
  4. 'id_kategoria = :id_kategoria'
  5. );
  6. $idpj_all=array(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15);
  7.  
  8. if (!empty($formData['id_prawo_jazdy']))
  9. {
  10. $where_idpj=array();
  11. $i=0;
  12. foreach($formData['id_prawo_jazdy'] as $idpj){
  13. $where_idpj[]=':id_prawo_jazdy_'.$i;
  14. $bind[':id_prawo_jazdy_'.$i++]=$idpj;
  15. $idpj_all=array_diff($idpj_all,array($idpj));
  16. }
  17. $where[] = 'id_prawo_jazdy IN('.implode(',',$where_idpj).')';
  18. }
  19. require_once('pager.class.php');
  20. try{
  21. $pager = new Pager('idPagera', null);
  22. $pager->SetTotalRecords($recordsCount);
  23. $pager->Make(true);
  24. $pag = $pager->Render();
  25. $start = $pager->GetIndexRecordStart();
  26. $end = $pager->GetIndexRecordEnd();
  27. }
  28. catch (Exception $e) {
  29. echo $e->getMessage();
  30. }
  31.  
  32.  
  33.  
  34. try
  35. {
  36. $sql="SELECT sql_calc_found_rows o.miasto,o.id_kraj,o.id_wojewodztwo,p.id_ogloszenia,p.id_prawo_jazdy FROM ogloszenia o
  37. LEFT OUTER JOIN pj p on o.id=p.id_ogloszenia WHERE ". implode( ' AND ', $where);
  38. if(!empty($formData['id_prawo_jazdy']) && count($idpj_all))
  39. $sql.=" and o.id not in (select o2.id from ogloszenia as o2,pj as p2 where o2.id=p2.id_ogloszenia AND p2.id_prawo_jazdy in(".implode(',',$idpj_all)."))
  40. group by o.id having count(o.id)=".count($where_idpj)." order by o.wyroznione DESC,o.id DESC limit ".$start.",5";
  41. elseif(!empty($formData['id_prawo_jazdy']))
  42. $sql.=" group by o.id having count(o.id)=".count($where_idpj)." order by o.wyroznione DESC,o.id DESC limit ".$start.",5";
  43. else
  44. $sql.=" group by o.id order by o.wyroznione DESC,o.id DESC limit ".$start.",5";
  45. $stmt=$pdo->prepare($sql);
  46. $stmt->execute( $bind );
  47.  
  48. while($ogloszenia = $stmt -> fetch())
  49. {
  50. //tabela
  51. }
  52. $stmt -> closeCursor();
  53. }
  54. catch(PDOException $e)
  55. {
  56. print "Błąd: " . $e->getMessage() . "<br/>";
  57.  
  58. }
  59.  
  60.  
  61. $sql = "select found_rows()";
  62. $stmt = $pdo->query($sql);
  63. $recordsCount = $stmt->fetchColumn(0);
  64.  
  65. try{
  66. $pager = new Pager('idPagera', null);
  67. $pager->SetTotalRecords($recordsCount);
  68. $pager->Make(true);
  69. $pag = $pager->Render();
  70. $start = $pager->GetIndexRecordStart();
  71. $end = $pager->GetIndexRecordEnd();
  72. }
  73. catch (Exception $e) {
  74. echo $e->getMessage();
  75. }
  76. ?>
nospor
Za pierwszym razem dla pagera ustawiasz zmienną $recordsCount, ktora nie istnieje, wiec trudno oczekiwać by pager zwracał ci poprawne indeksy do stronicowania... Pomysl przez chwilę jak to można obejsc smile.gif
peklo
nospor i znowu będe musiał kolejny miesiąc kombinować. Ale chyba jestem coraz bliżej smile.gif

muszę jeszcze dać jednego selecta na samej górze przed inicjacją pagera?

w linii 20 przed try dałem

  1. $sql = "select count(id) from ogloszenia";
  2. $stmt = $pdo->query($sql);
  3. $recordsCount = $stmt->fetchColumn(0);


i teraz niby działa dobrze ale mam 3 selecty i dwa razy zainicjowany pager. czy tak może być?

nospor
ech....

Po prostu za pierwszym razem zamiast
$pager->SetTotalRecords($recordsCount);
daj
$pager->SetTotalRecords(1000000);
i juz
peklo
ok dzięki mam nadzieje że juz nie będe mieć problemów z tym stronicowaniem:)
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.