Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

3 Stron V   1 2 3 >  
Reply to this topicStart new topic
> problem ze stronicowaniem
peklo
post
Post #1





Grupa: Zarejestrowani
Postów: 420
Pomógł: 0
Dołączył: 27.07.2011

Ostrzeżenie: (10%)
X----


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 );
Go to the top of the page
+Quote Post
nospor
post
Post #2





Grupa: Moderatorzy
Postów: 36 559
Pomógł: 6315
Dołączył: 27.12.2004




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...
Go to the top of the page
+Quote Post
peklo
post
Post #3





Grupa: Zarejestrowani
Postów: 420
Pomógł: 0
Dołączył: 27.07.2011

Ostrzeżenie: (10%)
X----


no to tak robiłem i klapa. kombinowałem na wszelkie sposoby i nic (IMG:style_emoticons/default/sad.gif)

Ten post edytował peklo 12.05.2014, 18:54:59
Go to the top of the page
+Quote Post
nospor
post
Post #4





Grupa: Moderatorzy
Postów: 36 559
Pomógł: 6315
Dołączył: 27.12.2004




W kodzie co tu pokazales raczej nie widac bys tak wlasnie zrobil. Jak dla mnie zapytanie do zliczania jest rozne od zapytania do wyswietlania.
Go to the top of the page
+Quote Post
peklo
post
Post #5





Grupa: Zarejestrowani
Postów: 420
Pomógł: 0
Dołączył: 27.07.2011

Ostrzeżenie: (10%)
X----


tak bo to zapytanie działa mi najlepiej z posród tych które zkleiłem wcześniej (IMG:style_emoticons/default/smile.gif) . Nospor ja Cię zawsze słucham (IMG:style_emoticons/default/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
Go to the top of the page
+Quote Post
trueblue
post
Post #6





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


  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";
Go to the top of the page
+Quote Post
peklo
post
Post #7





Grupa: Zarejestrowani
Postów: 420
Pomógł: 0
Dołączył: 27.07.2011

Ostrzeżenie: (10%)
X----


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

Ten post edytował peklo 12.05.2014, 19:55:08
Go to the top of the page
+Quote Post
trueblue
post
Post #8





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


A jak pobierasz z tego zapytania ilość wszystkich rekordów?
Go to the top of the page
+Quote Post
peklo
post
Post #9





Grupa: Zarejestrowani
Postów: 420
Pomógł: 0
Dołączył: 27.07.2011

Ostrzeżenie: (10%)
X----


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
Go to the top of the page
+Quote Post
trueblue
post
Post #10





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


Chciałem abyś pokazał jakim kodem pobierasz z zapytania, które Ci podałem ilość wszystkich rekordów.
Go to the top of the page
+Quote Post
peklo
post
Post #11





Grupa: Zarejestrowani
Postów: 420
Pomógł: 0
Dołączył: 27.07.2011

Ostrzeżenie: (10%)
X----


  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. );


Ten post edytował peklo 12.05.2014, 20:07:09
Go to the top of the page
+Quote Post
trueblue
post
Post #12





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
peklo
post
Post #13





Grupa: Zarejestrowani
Postów: 420
Pomógł: 0
Dołączył: 27.07.2011

Ostrzeżenie: (10%)
X----


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;


Ten post edytował peklo 12.05.2014, 20:20:08
Go to the top of the page
+Quote Post
trueblue
post
Post #14





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


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{
Go to the top of the page
+Quote Post
peklo
post
Post #15





Grupa: Zarejestrowani
Postów: 420
Pomógł: 0
Dołączył: 27.07.2011

Ostrzeżenie: (10%)
X----


wszytkich rekordow=18
Go to the top of the page
+Quote Post
trueblue
post
Post #16





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


I z takim kodem (już bez tego echo) nie działa stronicowanie?
Go to the top of the page
+Quote Post
peklo
post
Post #17





Grupa: Zarejestrowani
Postów: 420
Pomógł: 0
Dołączył: 27.07.2011

Ostrzeżenie: (10%)
X----


działa stronicowanie ale tylko dla warunkóww wyszukiwania z tabeli głownej. Jak zaznacze przykladowo 1 checkbox pj to pokazuje tylko 1 rekord
Go to the top of the page
+Quote Post
trueblue
post
Post #18





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


A co pokazuje powyższe echo kiedy zaznaczysz ten jeden checkbox?
Go to the top of the page
+Quote Post
peklo
post
Post #19





Grupa: Zarejestrowani
Postów: 420
Pomógł: 0
Dołączył: 27.07.2011

Ostrzeżenie: (10%)
X----


wszytkich rekordow=1
Go to the top of the page
+Quote Post
nospor
post
Post #20





Grupa: Moderatorzy
Postów: 36 559
Pomógł: 6315
Dołączył: 27.12.2004




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 (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
trueblue
post
Post #21





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


Oczywiście, że masz rację nospor.

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

Go to the top of the page
+Quote Post
peklo
post
Post #22





Grupa: Zarejestrowani
Postów: 420
Pomógł: 0
Dołączył: 27.07.2011

Ostrzeżenie: (10%)
X----


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{


Ten post edytował peklo 13.05.2014, 08:26:28
Go to the top of the page
+Quote Post
trueblue
post
Post #23





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


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.

Ten post edytował trueblue 13.05.2014, 08:33:32
Go to the top of the page
+Quote Post
peklo
post
Post #24





Grupa: Zarejestrowani
Postów: 420
Pomógł: 0
Dołączył: 27.07.2011

Ostrzeżenie: (10%)
X----


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)."))";

Ten post edytował peklo 13.05.2014, 09:50:42
Go to the top of the page
+Quote Post
trueblue
post
Post #25





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
peklo
post
Post #26





Grupa: Zarejestrowani
Postów: 420
Pomógł: 0
Dołączył: 27.07.2011

Ostrzeżenie: (10%)
X----


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
Go to the top of the page
+Quote Post
nospor
post
Post #27





Grupa: Moderatorzy
Postów: 36 559
Pomógł: 6315
Dołączył: 27.12.2004




Nie chodzilo o dołączenie drugiej tabeli, tylko o stosowanie group by. Wyjasnialem to w jednym z postow tutaj.
Go to the top of the page
+Quote Post
peklo
post
Post #28





Grupa: Zarejestrowani
Postów: 420
Pomógł: 0
Dołączył: 27.07.2011

Ostrzeżenie: (10%)
X----


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

Ten post edytował peklo 20.05.2014, 14:05:11
Go to the top of the page
+Quote Post
Crozin
post
Post #29





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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.

Ten post edytował Crozin 20.05.2014, 14:03:30
Go to the top of the page
+Quote Post
peklo
post
Post #30





Grupa: Zarejestrowani
Postów: 420
Pomógł: 0
Dołączył: 27.07.2011

Ostrzeżenie: (10%)
X----


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)."";
Go to the top of the page
+Quote Post
nospor
post
Post #31





Grupa: Moderatorzy
Postów: 36 559
Pomógł: 6315
Dołączył: 27.12.2004




Jkabys mial dobrze, to by ci poprawnie stronicowalo (IMG:style_emoticons/default/wink.gif)

@Crozin nie jestes w kontekscie problemu i tutaj naprawde nie o to chodzi (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
peklo
post
Post #32





Grupa: Zarejestrowani
Postów: 420
Pomógł: 0
Dołączył: 27.07.2011

Ostrzeżenie: (10%)
X----


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);


Ten post edytował peklo 21.05.2014, 16:11:09
Go to the top of the page
+Quote Post
nospor
post
Post #33





Grupa: Moderatorzy
Postów: 36 559
Pomógł: 6315
Dołączył: 27.12.2004




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 (IMG:style_emoticons/default/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 (IMG:style_emoticons/default/wink.gif)
Go to the top of the page
+Quote Post
peklo
post
Post #34





Grupa: Zarejestrowani
Postów: 420
Pomógł: 0
Dołączył: 27.07.2011

Ostrzeżenie: (10%)
X----


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.

Ten post edytował peklo 21.05.2014, 16:52:18
Go to the top of the page
+Quote Post
nospor
post
Post #35





Grupa: Moderatorzy
Postów: 36 559
Pomógł: 6315
Dołączył: 27.12.2004




PIsales to juz wielokrotnie. Po co powtarzasz? Podalem ci najmniej problemowe rozwiązanie.
Go to the top of the page
+Quote Post
peklo
post
Post #36





Grupa: Zarejestrowani
Postów: 420
Pomógł: 0
Dołączył: 27.07.2011

Ostrzeżenie: (10%)
X----


zmieniłem zapytanie i teraz mi dobrze stronicuje ale pokazuje po jednym rekordzie (IMG:style_emoticons/default/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

Ten post edytował peklo 26.05.2014, 21:14:37
Go to the top of the page
+Quote Post
nospor
post
Post #37





Grupa: Moderatorzy
Postów: 36 559
Pomógł: 6315
Dołączył: 27.12.2004




Zamien
limit ".$start.",".($end - $start + 1);
na:
limit ".$start.",5";

Jesli to nie pomoze, pokaz caly kod po zmianach, wlacznie z inicjalizacją pagera
Go to the top of the page
+Quote Post
peklo
post
Post #38





Grupa: Zarejestrowani
Postów: 420
Pomógł: 0
Dołączył: 27.07.2011

Ostrzeżenie: (10%)
X----


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. ?>


Ten post edytował peklo 26.05.2014, 21:30:16
Go to the top of the page
+Quote Post
nospor
post
Post #39





Grupa: Moderatorzy
Postów: 36 559
Pomógł: 6315
Dołączył: 27.12.2004




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 (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
peklo
post
Post #40





Grupa: Zarejestrowani
Postów: 420
Pomógł: 0
Dołączył: 27.07.2011

Ostrzeżenie: (10%)
X----


nospor i znowu będe musiał kolejny miesiąc kombinować. Ale chyba jestem coraz bliżej (IMG:style_emoticons/default/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ć?

Go to the top of the page
+Quote Post
nospor
post
Post #41





Grupa: Moderatorzy
Postów: 36 559
Pomógł: 6315
Dołączył: 27.12.2004




ech....

Po prostu za pierwszym razem zamiast
$pager->SetTotalRecords($recordsCount);
daj
$pager->SetTotalRecords(1000000);
i juz
Go to the top of the page
+Quote Post
peklo
post
Post #42





Grupa: Zarejestrowani
Postów: 420
Pomógł: 0
Dołączył: 27.07.2011

Ostrzeżenie: (10%)
X----


ok dzięki mam nadzieje że juz nie będe mieć problemów z tym stronicowaniem:)
Go to the top of the page
+Quote Post

3 Stron V   1 2 3 >
Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 3.10.2025 - 20:49