Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]błąd wykonania zapytania w wyszukiwarce php
Forum PHP.pl > Forum > Przedszkole
peklo
Witam
Zwracam się o pomoc bo nie mogę znaleźć co i jak zmienić żeby wyeliminować ten błąd. Niby wszystko wyszukuje normalnie (przy jednym zaznaczeniu lub kilku checkbox) ale jak zaznacze wszystkie checkboxy w wyszukiwarce wywala mi taki bład:
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 ')) group by o.id having count(o.id)=15 order by o.wyroznione DESC,o.id DESC' at line 3

mam taki kod
  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. }
  13. $sql="SELECT o.miasto,o,o.aktywne,o.id,o.id_kategoria,o.nazwa_ogloszenia,
  14. 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
  15. WHERE ". implode( ' AND ', $where);
  16. if(!empty($formData['id_prawo_jazdy']))
  17. $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)."))
  18. group by o.id having count(o.id)=".count($where_idpj)." order by o.wyroznione DESC,o.id DESC";
  19. else
  20. $sql.=" group by o.id order by o.wyroznione DESC,o.id DESC";
  21. $stmt=$pdo->prepare($sql);
  22. $stmt->execute( $bind );
[php][/php]
Sephirus
Wali błędem bo masz pustą tablicę $idpj_all;

Diffujesz każdy podany "checkbox" z tablicą zawierającą wszytskie po jednym...

i tak za każdym takim wywołaniem z tej tablicy wypada Ci jeden który jest taki sam... aż tablica staje się pusta...

daj w 17 linii przy implode(',',$idpj_all) warunek czy tablica ta nie jest pusta wink.gif

EDIT: w ogóle wydaje mi się, że masz to na odwrót bo podając na przykład 1,2 i 3 to do SQLki o ile się nie mylę pójdzie od 4 wzwyż... więc wykluczasz to co ktoś wybrał - dałbym tam jeszcze "NOT" przed "IN()"
peklo
a jak to konkretniej napisać smile.gif
Jaśli zaznacze jeden lub kika checkbox to działa ok ale ze wszystkimi sie juz sypie
Jak daje not przed in i zaznacze checkbox to nic nie wyszukuje
Sephirus, a jak podać ten warunek? dla tego "daj w 17 linii przy implode(',',$idpj_all) warunek czy tablica ta nie jest pusta"
Sephirus
No tak - napisałem Ci dlaczego - to CI powinno wystarczyć...

Mała podpowiedź (dla uproszczenia załóżmy że ma 5 elementów):

tablica: 1,2,3,4,5

user wybrał wszystkie więc po kolei:

dla 1 zostaje 2,3,4,5
dla 2 zostaje 3,4,5
dla 3 zostaje 4,5
dla 4 zostaje 5,
dla 5 tablica jest pusta...

implode z takiej tablicy da ciąg pusty, który wkładasz do IN()... stąd błąd smile.gif
peklo
o jojoj coś spróbuje ale wątpie zeby dało to pozytywny efekt bez dalszej korespondencji smile.gif
kurde daje empty albo isset ale cos źle robie hmm
Sephirus
Spróbuj tak:

  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. if(count($idpj_all) > 0) // tylko jeśli tablica jest nie pusta
  13. $where[] = 'id_prawo_jazdy IN('.implode(',',$where_idpj).')';
  14. }
  15. $sql="SELECT o.miasto,o,o.aktywne,o.id,o.id_kategoria,o.nazwa_ogloszenia,
  16. 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
  17. WHERE ". implode( ' AND ', $where);
  18. if(!empty($formData['id_prawo_jazdy']) && count($idpj_all)) // dodatkowe sprawdzenie - jeśli $idpj_all jest puste to i tak bierze tylko te które mają wszystkie opcje
  19. $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)."))
  20. group by o.id having count(o.id)=".count($where_idpj)." order by o.wyroznione DESC,o.id DESC";
  21. else
  22. $sql.=" group by o.id order by o.wyroznione DESC,o.id DESC";
  23. $stmt=$pdo->prepare($sql);
  24. $stmt->execute( $bind );
peklo
przy zaznaczeniu wszystkich checkbox teraz wywala to:

SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens
Sephirus
  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. $idpj_bind=array();
  7. $i=0;
  8. foreach($formData['id_prawo_jazdy'] as $idpj){
  9. $where_idpj[]=':id_prawo_jazdy_'.$i;
  10. $idpj_bind[':id_prawo_jazdy_'.$i++]=$idpj;
  11. $idpj_all=array_diff($idpj_all,array($idpj));
  12. }
  13. if(count($idpj_all) > 0) {// tylko jeśli tablica jest nie pusta
  14. $where[] = 'id_prawo_jazdy IN('.implode(',',$where_idpj).')';
  15. $bind = array_merge($bind,$idpj_bind);
  16. }
  17. }
  18. $sql="SELECT o.miasto,o,o.aktywne,o.id,o.id_kategoria,o.nazwa_ogloszenia,
  19. 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
  20. WHERE ". implode( ' AND ', $where);
  21. if(!empty($formData['id_prawo_jazdy']) && count($idpj_all)) // dodatkowe sprawdzenie - jeśli $idpj_all jest puste to i tak bierze tylko te które mają wszystkie opcje
  22. $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)."))
  23. group by o.id having count(o.id)=".count($where_idpj)." order by o.wyroznione DESC,o.id DESC";
  24. else
  25. $sql.=" group by o.id order by o.wyroznione DESC,o.id DESC";
  26. $stmt=$pdo->prepare($sql);
  27. $stmt->execute( $bind );
peklo
teraz z kolei przy zaznaczeniu wszystkich juz nie wali błędem smile.gif

Ale pokazuje znowu wszystkie rekordy smile.gif A powinno ich być coraz mniej lub 0

Jest na to jakaś rada:)
Sephirus
W sumie jeśli się zdejmie to jedno ograniczenie powinno być ok :

  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. }
  14. $sql="SELECT o.miasto,o,o.aktywne,o.id,o.id_kategoria,o.nazwa_ogloszenia,
  15. 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
  16. WHERE ". implode( ' AND ', $where);
  17. if(!empty($formData['id_prawo_jazdy']) && count($idpj_all)) // dodatkowe sprawdzenie - jeśli $idpj_all jest puste to i tak bierze tylko te które mają wszystkie opcje
  18. $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)."))
  19. group by o.id having count(o.id)=".count($where_idpj)." order by o.wyroznione DESC,o.id DESC";
  20. else
  21. $sql.=" group by o.id order by o.wyroznione DESC,o.id DESC";
  22. $stmt=$pdo->prepare($sql);
  23. $stmt->execute( $bind );
peklo
Po wyrzuceniu tego koodu pokazuje wszystkie rekordy(przy oczywiscie zaznaczonych wszystkich checkboxach)
Witam Trueblue:)
Sephirus
kurde racja - tak to jest jak się robi 10 rzeczy naraz tongue.gif

  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. }
  14. $sql="SELECT o.miasto,o,o.aktywne,o.id,o.id_kategoria,o.nazwa_ogloszenia,
  15. 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
  16. WHERE ". implode( ' AND ', $where);
  17. if(!empty($formData['id_prawo_jazdy']) && count($idpj_all)) // dodatkowe sprawdzenie - jeśli $idpj_all jest puste to i tak bierze tylko te które mają wszystkie opcje
  18. $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)."))
  19. group by o.id having count(o.id)=".count($where_idpj)." order by o.wyroznione DESC,o.id DESC";
  20. elseif(!empty($formData['id_prawo_jazdy']))
  21. $sql.=" group by o.id having count(o.id)=".count($where_idpj)." order by o.wyroznione DESC,o.id DESC";
  22. else
  23. $sql.=" group by o.id order by o.wyroznione DESC,o.id DESC";
  24. $stmt=$pdo->prepare($sql);
  25. $stmt->execute( $bind );
peklo
no wielki szacun za pomoc i punkcik dla Ciebie. Pozdro
Będe mieć jeszcze sprawę odnośnie jednej rzeczy ze stronicowaniem, jak można póxniej do Ciebie wysłać maila z pytaniem to będe wdzięczny
Sephirus
Ciężko będzie bo odpowiem w poniedziałek dopiero wink.gif
peklo
no jasne nie ma sprawy, weekend jest w sumie do zabawy ,a nie pracy
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.