Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]wyszukiwarka z parametrem IN
Forum PHP.pl > Forum > Przedszkole
Stron: 1, 2
peklo
Witam
Mam problem ze zmianą warunku w wyszukiwarce. Nie wiem jak zmienić ten kod żeby do warunku WHERE dodać warunek IN. Mam problem z checkboxami o tej samej nazwie. Pomimo zaznaczenia kilku wyszukuje mi tylko po ostatnim.
Chodzi o zmienne id_prawo_jazdy.
Tabele połączone są ze sobą zmienną ID gdzie id-głównej=id-pomocniczej (dla id-głównego może być wiele id pomocniczych w tym przypadku id_prawo_jazdy). Wszystko w wyszukiwarce działa OK oprócz niestety tych checkbox o nazwie id_prawo_jazdy

  1. <?php
  2. $bind = array(
  3. ':id_kategoria' => 1,
  4. );
  5. $where = array(
  6. 'id_kategoria = :id_kategoria'
  7. );
  8. if (!empty($_POST['szukaj']))
  9. {
  10. $_SESSION['form'] = array(
  11. 'miasto' => $_POST['miasto'],
  12. 'id_prawo_jazdy' => $_POST['id_prawo_jazdy'],
  13. );
  14. }
  15. $formData = array(
  16. 'miasto' => !isset($_SESSION['form']) ? null : $_SESSION['form']['miasto'],
  17. 'id_prawo_jazdy' => !isset($_SESSION['form']) ? null : $_SESSION['form']['id_prawo_jazdy'],
  18. );
  19.  
  20. if (!empty($formData['miasto']))
  21. {
  22. $where[] = "miasto LIKE :miasto";
  23. $bind[':miasto'] = '%' . $formData['miasto'] . '%';
  24. }
  25. if (!empty($formData['id_prawo_jazdy']))
  26. {
  27. $where[] = 'id_prawo_jazdy = :id_prawo_jazdy';
  28. $bind[':id_prawo_jazdy'] = $formData['id_prawo_jazdy'];
  29. }
  30.  
  31. //Przykładowe pola wyszukiwarki
  32. ?>
  33. <form action="" method="post" id="signupForm" style='display: inline'>
  34. Miasto
  35. <input type="text" id="miasto" name="miasto" value="<?php echo $formData['miasto'];?>"/>
  36.  
  37. Prawo jazdy
  38. <input name='id_prawo_jazdy[]' type='checkbox' value='1'<?php if($formData['id_prawo_jazdy']==1) {echo 'checked="checked"';} ?>> AM
  39. <input name='id_prawo_jazdy[]' type='checkbox' value='2'<?php if($formData['id_prawo_jazdy']==2) {echo 'checked="checked"';} ?>> A1
  40. </form>
  41.  
  42. <?php
  43. try
  44. {
  45. $stmt = $pdo->prepare("SELECT o.miasto,o.id_kategoria,p.id_ogloszenia,p.id_prawo_jazdy FROM ogloszenia o LEFT OUTER JOIN pj p on o.id=p.id_ogloszenia WHERE ". implode( ' AND ', $where )." group by o.id order by o.id DESC");
  46. $stmt->execute( $bind );
  47. while($ogloszenia = $stmt -> fetch())
  48. {
  49. // WYSWIETLENIE TABELI Z DANYMI
  50. }
  51. $stmt -> closeCursor();
  52. }
  53. catch(PDOException $e)
  54. {
  55. print "Bład: " . $e->getMessage() . "<br/>";
  56.  
  57. }
  58.  
  59. ?>


zmieniłem tu na IN to teraz mam błąd

if (!empty($formData['id_prawo_jazdy']))
{
$IN[] = 'id_prawo_jazdy = :id_prawo_jazdy';
$bind[':id_prawo_jazdy'] = $formData['id_prawo_jazdy'];
}
trueblue
http://stackoverflow.com/a/10722827
peklo
czyli mam zrobić coś takiego?

  1. if (!empty($formData['id_prawo_jazdy']))
  2. {
  3. $IN = [1,2];
  4. $bind[':id_prawo_jazdy'] = $formData['id_prawo_jazdy'];
  5. }
trueblue
Nie.
Spróbuj:
  1. $zap=str_repeat('?,',count($ids)-1. '?';
  2. $stmt = $pdo->prepare("SELECT o.miasto,o.id_kategoria,p.id_ogloszenia,p.id_prawo_jazdy FROM ogloszenia o LEFT OUTER JOIN pj p on o.id=p.id_ogloszenia WHERE ". implode( ' AND ', $where ).(!empty($_POST['id_prawo_jazdy'])?" AND p.id_prawo_jazdy IN (".$zap.")":"")." group by o.id order by o.id DESC");
  3. IF(!empty($_POST['id_prawo_jazdy'])){
  4. foreach($_POST['id_prawo_jazdy'] AS $idpz){
  5. $stmt->bindValue(1+count($bind),$idpz,PDO::PARAM_INT);
  6. }
  7. }
  8. $stmt->execute( $bind );
peklo
coś nie tak

$zap=str_repeat('?,',count($ids)-1. '?';


Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING
trueblue
  1. $zap=str_repeat('?,',count($ids)-1). '?';
peklo
to mam teraz błąd

Warning: str_repeat() [function.str-repeat]: Second argument has to be greater than or equal to 0
trueblue
  1. $zap=str_repeat('?,',count($_POST['id_prawo_jazdy'])-1). '?';
peklo
a jak klikne w checkbox + szukaj to dodatkowo mam

Warning: Invalid argument supplied for foreach() in

oczywiscie rozumiem że to mam już usunąć

  1. if (!empty($formData['id_prawo_jazdy']))
  2. {
  3. $where[] = 'id_prawo_jazdy = :id_prawo_jazdy';
  4. $bind[':id_prawo_jazdy'] = $formData['id_prawo_jazdy'];
  5. }
trueblue
Tak, ten fragment do usunięcia.

Daj print_r($_POST['id_prawo_jazdy']); przed foreach i pokaż.
peklo
mam taki błąd
Warning: str_repeat() [function.str-repeat]: Second argument has to be greater than or equal to 0 in

jak zaznacze checkboxy i wezme szukaj to i tak zaznacza mi jeden (ostatni) i pokazuje się błąd

Warning: Invalid argument supplied for foreach() in on line 320
Błąd połączenia z bazą!: SQLSTATE[HY093]: Invalid parameter number: mixed named and positional parameters

print wyświetla mi nr checkboxa ale tylko jednego pomimo zaznaczenia kilku- czyli ostatni

acha i w ogóle nie działa wyszukiwarka pomimo wybierania innych parametrów nie mówie o id_prawo_jazdy
trueblue
Nie modyfikujesz czasem wcześniej w kodzie zmiennej $_POST['id_prawo_jazdy'] ?
Pokaż wynik print_r, albo lepiej: var_dump($_POST['id_prawo_jazdy']);
peklo
var_dump po zaznaczeniu przykładowego checkbox pokazuje
string(1) "3"

Nospor podpowiedział mi że mam "poprawic na IN i wpisanie wartosci "
Jak chce porównać kilka wartosci to mam używać IN
Ale nie wiem jak to zmienić i zaimplementować razem z WHERE z innymi zmiennymi. Chodzi pewnie o poprawę tego kodu + zapytanie

if (!empty($formData['id_prawo_jazdy']))
{
$where[] = 'id_prawo_jazdy = :id_prawo_jazdy';
$bind[':id_prawo_jazdy'] = $formData['id_prawo_jazdy'];
}

tj Trueblue nie da się już nic z tym zrobić? sad.gif
trueblue
Kod, który Ci podałem wyżej (z poprawkami) powinien działać.
Obecnie u Ciebie jest problem z tym, że zmienna $_POST['id_prawo_jazdy'] jest stringiem, a nie tablicą.

Ale jak bardzo chcesz pozostawić poprzedni kod, to możesz zrobić tak:
  1. $_SESSION['form'] = array(
  2. 'miasto' => $_POST['miasto'],
  3. 'id_prawo_jazdy' => implode(',',$_POST['id_prawo_jazdy']);
  4. );

Co nie zmienia faktu, że $_POST['id_prawo_jazdy'] musi być tablicą.
Dodatkowo to przeczy idei bindowania wartości.
peklo
no właśnie nie wiem jak to wszystko połączyć + jeszcze bindowanie
trueblue
Jak to nie wiesz?
Podałem Ci jeden przykład i przed chwilą drugi.

Obecnie Twoim problemem jest to, że $_POST['id_prawo_jazdy'] nie jest tablicą.
Ponawiam pytanie: czy wcześniej w kodzie nie modyfikujesz w jakiś sposób tej zmiennej albo całej tablicy $_POST?
peklo
  1. <?php
  2. $bind = array(
  3. ':id_kategoria' => 1,
  4. );
  5. $where = array(
  6. 'id_kategoria = :id_kategoria'
  7. );
  8. if (!empty($_POST['szukaj']))
  9. {
  10. $_SESSION['form'] = array(
  11. 'miasto' => $_POST['miasto'],
  12. 'id_prawo_jazdy' => implode(',',$_POST['id_prawo_jazdy']);
  13. );
  14. }
  15. $formData = array(
  16. 'miasto' => !isset($_SESSION['form']) ? null : $_SESSION['form']['miasto'],
  17. 'id_prawo_jazdy' => !isset($_SESSION['form']) ? null : $_SESSION['form']['id_prawo_jazdy'],
  18. );
  19.  
  20. if (!empty($formData['miasto']))
  21. {
  22. $where[] = "miasto LIKE :miasto";
  23. $bind[':miasto'] = '%' . $formData['miasto'] . '%';
  24. }
  25. if (!empty($formData['id_prawo_jazdy']))
  26. {
  27. $where[] = 'id_prawo_jazdy = :id_prawo_jazdy';
  28. $bind[':id_prawo_jazdy'] = $formData['id_prawo_jazdy'];
  29. }
  30.  
  31.  
  32.  
  33. //Przykładowe pola wyszukiwarki
  34. ?>
  35. <form action="" method="post" id="signupForm" style='display: inline'>
  36. Miasto <input type="text" id="miasto" name="miasto" value="<?php echo $formData['miasto'];?>"/>
  37.  
  38. Prawo jazdy <input name='id_prawo_jazdy[]' type='checkbox' value='1'<?php if($formData['id_prawo_jazdy']==1) {echo 'checked="checked"';} ?>> AM
  39. <input name='id_prawo_jazdy[]' type='checkbox' value='2'<?php if($formData['id_prawo_jazdy']==2) {echo 'checked="checked"';} ?>> A1
  40. </form>
  41.  
  42. <?php
  43. try
  44. {
  45. $stmt = $pdo->prepare("SELECT o.miasto,o.id_kategoria,p.id_ogloszenia,p.id_prawo_jazdy FROM ogloszenia o LEFT OUTER JOIN pj p on o.id=p.id_ogloszenia WHERE ". implode( ' AND ', $where )."
  46. group by o.id order by o.id DESC");
  47. $stmt->execute( $bind );
  48. while($ogloszenia = $stmt -> fetch())
  49. {
  50. // WYSWIETLENIE TABELI Z DANYMI
  51.  
  52. }
  53. $stmt -> closeCursor();
  54. }
  55. catch(PDOException $e)
  56. {
  57. print "Błąd: " . $e->getMessage() . "<br/>";
  58.  
  59. }
  60.  
  61. ?>


jak mam stary kod i jak wezme var_dump($_POST['id_prawo_jazdy']); i zaznaczę kilka checkbox to mam np:

array(3) { [0]=> string(1) "1" [1]=> string(1) "5" [2]=> string(2) "10" }
trueblue
Jeśli to co podałeś to Twój "stary" kod, to musisz znaleźć różnicę, dlaczego ten zwraca tablicę, a nowy string.
peklo
to jest stary kod uproszczonyh oczywiście a zostało w nim zmienione to:
'id_prawo_jazdy' => $_POST['id_prawo_jazdy'],
na to:
'id_prawo_jazdy' => implode(',',$_POST['id_prawo_jazdy']);
trueblue
To ja bym chciał zobaczyć co masz w $_POST['id_prawo_jazdy'] (var_dump), ale przed implodowaniem.
peklo
to jest stary kod bez implode

'id_prawo_jazdy' => $_POST['id_prawo_jazdy'],
wynik
array(3) { [0]=> string(1) "1" [1]=> string(1) "2" [2]=> string(1) "3" }

i z implode

'id_prawo_jazdy' => implode(',',$_POST['id_prawo_jazdy']);

wynik
array(3) { [0]=> string(1) "1" [1]=> string(1) "2" [2]=> string(1) "3" }

czyli to samo

chociaż w samym zapytaniu jest już implode czyli WHERE ". implode( ' AND ', $where )."
trueblue
Użyj metody z implode (post #14) i pokaż jak wygląda zapytanie sql.
peklo
więc teraz mam tak

  1. if (!empty($_POST['szukaj']))
  2. {
  3. $_SESSION['form'] = array(
  4. 'miasto' => $_POST['miasto'],
  5. 'id_prawo_jazdy' => implode(',',$_POST['id_prawo_jazdy']);
  6. );
  7. }
  8.  
  9. //lub wcześniej bez implode 'id_prawo_jazdy' => $_POST['id_prawo_jazdy'],
  10.  
  11. //i sql
  12.  
  13. $stmt = $pdo->prepare("SELECT o.miasto,o.id_kategoria,p.id_ogloszenia,p.id_prawo_jazdy FROM ogloszenia o LEFT OUTER JOIN pj p on o.id=p.id_ogloszenia WHERE ". implode( ' AND ', $where )." group by o.id order by o.id DESC");
trueblue
A tu tak:
  1. if (!empty($formData['id_prawo_jazdy']))
  2. {
  3. $where[] = 'id_prawo_jazdy IN(:id_prawo_jazdy)';
  4. $bind[':id_prawo_jazdy'] = $formData['id_prawo_jazdy'];
  5. }
peklo
nie nie jest tak:

  1. if (!empty($formData['id_prawo_jazdy']))
  2. {
  3. $where[] = 'id_prawo_jazdy = :id_prawo_jazdy';
  4. $bind[':id_prawo_jazdy'] = $formData['id_prawo_jazdy'];
  5. }
trueblue
Zmień na to co wyżej.
peklo
mam teraz tak

  1. $_SESSION['form'] = array(
  2. 'miasto' => $_POST['miasto'],
  3. 'id_prawo_jazdy' => implode(',',$_POST['id_prawo_jazdy']);
  4. );
  5. }
  6.  
  7.  
  8. if (!empty($formData['id_prawo_jazdy']))
  9. {
  10. $where[] = 'id_prawo_jazdy IN(:id_prawo_jazdy)';
  11. $bind[':id_prawo_jazdy'] = $formData['id_prawo_jazdy'];
  12. }
  13.  
  14.  
  15. $stmt = $pdo->prepare("SELECT o.miasto,o.id_kategoria,p.id_ogloszenia,p.id_prawo_jazdy FROM ogloszenia o LEFT OUTER JOIN pj p on o.id=p.id_ogloszenia WHERE ". implode( ' AND ', $where )." group by o.id order by o.id DESC");


i nadal nic
Ale teraz rzuca się do tegfo implode 'id_prawo_jazdy' => implode(',',$_POST['id_prawo_jazdy']);
Warning: implode() [function.implode]: Invalid arguments passed in on line 28

chodzi o ten błąd + wyszukuje ale tylko po ostatnim checkbox i nie zapamiętuje stanu
trueblue
To jest okrojony kod Twojego formularza:
  1. <?php
  2. echo implode(',',$_POST['id_prawo_jazdy']);
  3. ?>
  4. <form action="" method="post">
  5. <input name='id_prawo_jazdy[]' type='checkbox' value='1'> AM
  6. <input name='id_prawo_jazdy[]' type='checkbox' value='2'> A1
  7. <input name='id_prawo_jazdy[]' type='checkbox' value='3'> A2
  8. <input name='id_prawo_jazdy[]' type='checkbox' value='4'> A
  9. <input type="submit"/>
  10. </form>

Jak zapewne po testach zobaczysz, nie ma problemu z implodowaniem $_POST['id_prawo_jazdy'].
U Ciebie jest.
Pokaż wynik var_dump($_POST) przed implodowaniem.
peklo
kurde bo już sie troszke pogubiłem. W tym momencie mam tak
'id_prawo_jazdy' => implode(',',$_POST['id_prawo_jazdy']);

i jak zapuściłem
echo implode(',',$_POST['id_prawo_jazdy']);

i zaznaczyłem kilka checkbox to rzeczywiście wynik pokazał np 1,2,3,4
trueblue
I przy zaznaczeniu tych czterech checkboxów miałeś komunikat:
Warning: implode() [function.implode]: Invalid arguments passed in on line 28
?
peklo
nawet dwa

Warning: implode() [function.implode]: Invalid arguments passed in on line 13
echo implode(',',$_POST['id_prawo_jazdy']);

Warning: implode() [function.implode]: Invalid arguments passed in on line 31
'id_prawo_jazdy' => implode(',',$_POST['id_prawo_jazdy']),

i dodatkowo rozwala mi nie wiem czemu css
trueblue
Css rozwala przez warningi.

Zrób tak:
  1. var_dump($_POST);
  2. echo implode(',',$_POST['id_prawo_jazdy']);

I pokaż wynik var_dump. (Zaznacz jakieś checkboxy).
peklo
przed zaznaczeniem
array(0) { }
Warning: implode() [function.implode]: Invalid arguments passed in on line 14

i po zaznaczeniu checkbox

array(14) { ["data_dod"]=> string(0) "" ["data_dod2"]=> string(0) "" ["czas"]=> string(0) "" ["czas2"]=> string(0) "" ["id_lokalizacja"]=> string(2) "w1" ["id_wojewodztwo"]=> string(0) "" ["id_kraj"]=> string(0) "" ["miasto"]=> string(0) "" ["cena"]=> string(0) "" ["cena2"]=> string(0) "" ["za"]=> string(0) "" ["id_prawo_jazdy"]=> array(3) { [0]=> string(1) "1" [1]=> string(1) "2" [2]=> string(1) "3" } ["szukaj"]=> string(77) "" ["id"]=> string(2) "48" } 1,2,3
trueblue
To może tak:
  1. $_SESSION['form'] = array(
  2. 'miasto' => $_POST['miasto'],
  3. 'id_prawo_jazdy' => (isset($_POST['id_prawo_jazdy'])&&!empty($_POST['id_prawo_jazdy']))?implode(',',$_POST['id_prawo_jazdy']):null;
  4. );
peklo
to samo:(
trueblue
Warning dotyczy właśnie tej linii kodu? Tzn. 'id_prawo_jazdy' => (isset($_POST['id_prawo_jazdy'.....
peklo
no wlaśnie tyle to i ja wiem ale jaaaaaaaak to poprawić smile.gifsmile.gif żeby było OK
trueblue
A ja nie wiem, bo pytałem Ciebie czy warning dotyczy 3 linii kodu w poście powyżej.
Jeśli tak, to ja odpuszczam.
peklo
po usunięciu tego
var_dump($_POST);
echo implode(',',$_POST['id_prawo_jazdy']);

nie ma już błędów ale nadal zapamiętuje mi tylko jeden stan checkbox
trueblue
  1. <?php
  2. $idpj=array();
  3. if(!empty($formData['id_prawo_jazdy'])) $idpj=explode(',',$formData['id_prawo_jazdy']);
  4. ?>
  5. <input name='id_prawo_jazdy[]' type='checkbox' value='1'<?php if(in_array(1,$idpj)) {echo ' checked="checked"';} ?>> AM
  6. <input name='id_prawo_jazdy[]' type='checkbox' value='2'<?php if(in_array(2,$idpj)) {echo ' checked="checked"';} ?>> A1
peklo
mam rozumieć że mam stworzyc druga tablice?
dostałem taką odpowiedz od nospor
"Ma być IN, implode i wywalcie bindowanie bo tutaj jest bez sensu w przypadku IN. "
trueblue
Z czym masz obecnie problem? Pisałeś, że z zapamiętaniem stanów checkboxów. Podałem Ci rozwiązanie.

O bindowaniu i tym rozwiązaniu pisałem w poście 14.
peklo
sory trueblue ale było kilka zmian i się już w tym pogubiłem sad.gif

najlepiej jak wkleje to co mam okrojone oczywiscie
trueblue
Jeśli obecnie wyszukiwarka działa poprawnie (na podstawie checkboxów) i kod nie wywala błędów, to poście #40 masz rozwiązanie zapamiętywania.
peklo
mam tak tylko nie wiem czy to mam wkleić czy zastąpić

  1. $idpj=array();
  2. if(!empty($formData['id_prawo_jazdy'])) $idpj=explode(',',$formData['id_prawo_jazdy']);



  1. <?php
  2. if (!empty($_POST['szukaj']))
  3. {
  4. $_SESSION['form'] = array(
  5. 'miasto' => $_POST['miasto'],
  6. 'id_prawo_jazdy' => (isset($_POST['id_prawo_jazdy'])&&!empty($_POST['id_prawo_jazdy']))?implode(',',$_POST['id_prawo_jazdy']):null,
  7. );
  8. }
  9. $formData = array(
  10. 'miasto' => !isset($_SESSION['form']) ? null : $_SESSION['form']['miasto'],
  11. 'id_prawo_jazdy' => !isset($_SESSION['form']) ? null : $_SESSION['form']['id_prawo_jazdy'],
  12. );
  13.  
  14. $idpj=array();
  15. if(!empty($formData['id_prawo_jazdy'])) $idpj=explode(',',$formData['id_prawo_jazdy']);
  16.  
  17.  
  18. if (!empty($formData['miasto']))
  19. {
  20. $where[] = "miasto LIKE :miasto";
  21. $bind[':miasto'] = '%' . $formData['miasto'] . '%';
  22. }
  23. if (!empty($formData['id_prawo_jazdy']))
  24. {
  25. $where[] = 'id_prawo_jazdy IN(:id_prawo_jazdy)';
  26. $bind[':id_prawo_jazdy'] = $formData['id_prawo_jazdy'];// TĄ LINIJKE WYWALIĆ czy całość?
  27. }
  28.  
  29. //i przykładowy checkbox
  30. ?>
  31. <input name='id_prawo_jazdy[]' type='checkbox' value='1'<?php if(in_array(1,$idpj)) {echo 'checked="checked"';} ?>> AM
trueblue
Wstawiłbym linie 14-15 (1-2) przed linię 31, dla porządku.
Mam jednak pewne obawy, że po przypięciu sklejonych id_prawo_jazdy do IN, powstanie coś takiego:
id_prawo_jazdy IN('1,2') i będzie klapa.

Twój kod z moim pierwszym rozwiązaniem:
  1. <?php
  2. $bind = array(
  3. ':id_kategoria' => 1,
  4. );
  5. $where = array(
  6. 'id_kategoria = :id_kategoria'
  7. );
  8. if (!empty($_POST['szukaj']))
  9. {
  10. $_SESSION['form'] = array(
  11. 'miasto' => $_POST['miasto'],
  12. 'id_prawo_jazdy' => $_POST['id_prawo_jazdy'],
  13. );
  14. }
  15. $formData = array(
  16. 'miasto' => !isset($_SESSION['form']) ? null : $_SESSION['form']['miasto'],
  17. 'id_prawo_jazdy' => !isset($_SESSION['form']) ? null : $_SESSION['form']['id_prawo_jazdy'],
  18. );
  19.  
  20. if (!empty($formData['miasto']))
  21. {
  22. $where[] = "miasto LIKE :miasto";
  23. $bind[':miasto'] = '%' . $formData['miasto'] . '%';
  24. }
  25. if (!empty($formData['id_prawo_jazdy']))
  26. {
  27. $where[] = 'id_prawo_jazdy = :id_prawo_jazdy';
  28. $bind[':id_prawo_jazdy'] = $formData['id_prawo_jazdy'];
  29. }
  30.  
  31. //Przykładowe pola wyszukiwarki
  32. ?>
  33. <form action="" method="post" id="signupForm" style='display: inline'>
  34. Miasto
  35. <input type="text" id="miasto" name="miasto" value="<?php echo $formData['miasto'];?>"/>
  36.  
  37. Prawo jazdy
  38. <input name='id_prawo_jazdy[]' type='checkbox' value='1'<?php if(!empty($formData['id_prawo_jazdy'])&&in_array(1,$formData['id_prawo_jazdy'])) {echo 'checked="checked"';} ?>> AM
  39. <input name='id_prawo_jazdy[]' type='checkbox' value='2'<?php if(!empty($formData['id_prawo_jazdy'])&&in_array(2,$formData['id_prawo_jazdy'])) {echo 'checked="checked"';} ?>> A1
  40. </form>
  41.  
  42. <?php
  43. try
  44. {
  45. if(!empty($_POST['id_prawo_jazdy'])&&isset($_POST['id_prawo_jazdy'])) $zap=str_repeat('?,',count($_POST['id_prawo_jazdy'])-1). '?';
  46. $stmt = $pdo->prepare("SELECT o.miasto,o.id_kategoria,p.id_ogloszenia,p.id_prawo_jazdy FROM ogloszenia o LEFT OUTER JOIN pj p on o.id=p.id_ogloszenia WHERE ". implode( ' AND ', $where ).((!empty($_POST['id_prawo_jazdy'])&&isset($_POST['id_prawo_jazdy']))?" AND p.id_prawo_jazdy IN (".$zap.")":"")." group by o.id order by o.id DESC");
  47. if(!empty($_POST['id_prawo_jazdy'])&&isset($_POST['id_prawo_jazdy'])){
  48. foreach($_POST['id_prawo_jazdy'] AS $idpj){
  49. $stmt->bindValue(1+count($bind),$idpj,PDO::PARAM_INT);
  50. }
  51. }
  52. $stmt->execute( $bind );
  53. while($ogloszenia = $stmt -> fetch())
  54. {
  55. // WYSWIETLENIE TABELI Z DANYMI
  56. }
  57. $stmt -> closeCursor();
  58. }
  59. catch(PDOException $e)
  60. {
  61. print "Bład: " . $e->getMessage() . "<br/>";
  62.  
  63. }
  64.  
  65. ?>
peklo

ok zapamiętywać zapamiętuje ale po zaznaczeniu checkbox mam taki błąd
Błąd połączenia z bazą!: SQLSTATE[HY093]: Invalid parameter number: mixed named and positional parameters

inne zmienne w wyszukiwarce działają ok.
trueblue
Mój błąd, nie można bindować jednocześnie po indeksie i nazwie.

  1. <?php
  2. $bind = array(
  3. ':id_kategoria' => 1,
  4. );
  5. $where = array(
  6. 'id_kategoria = :id_kategoria'
  7. );
  8. if (!empty($_POST['szukaj']))
  9. {
  10. $_SESSION['form'] = array(
  11. 'miasto' => $_POST['miasto'],
  12. 'id_prawo_jazdy' => $_POST['id_prawo_jazdy'],
  13. );
  14. }
  15. $formData = array(
  16. 'miasto' => !isset($_SESSION['form']) ? null : $_SESSION['form']['miasto'],
  17. 'id_prawo_jazdy' => !isset($_SESSION['form']) ? null : $_SESSION['form']['id_prawo_jazdy'],
  18. );
  19.  
  20. if (!empty($formData['miasto']))
  21. {
  22. $where[] = "miasto LIKE :miasto";
  23. $bind[':miasto'] = '%' . $formData['miasto'] . '%';
  24. }
  25. if (!empty($formData['id_prawo_jazdy']))
  26. {
  27. $where_idpj=array();
  28. $i=0;
  29. foreach($formData['id_prawo_jazdy'] as $idpj){
  30. $where_idpj[]=':id_prawo_jazdy_'.$i;
  31. $bind[':id_prawo_jazdy_'.$i++]=$idpj;
  32. }
  33. $where[] = 'id_prawo_jazdy IN('.implode(',',$where_idpj).')';
  34. }
  35.  
  36. //Przykładowe pola wyszukiwarki
  37. ?>
  38. <form action="" method="post" id="signupForm" style='display: inline'>
  39. Miasto
  40. <input type="text" id="miasto" name="miasto" value="<?php echo $formData['miasto'];?>"/>
  41.  
  42. Prawo jazdy
  43. <input name='id_prawo_jazdy[]' type='checkbox' value='1'<?php if(!empty($formData['id_prawo_jazdy'])&&in_array(1,$formData['id_prawo_jazdy'])) {echo 'checked="checked"';} ?>> AM
  44. <input name='id_prawo_jazdy[]' type='checkbox' value='2'<?php if(!empty($formData['id_prawo_jazdy'])&&in_array(2,$formData['id_prawo_jazdy'])) {echo 'checked="checked"';} ?>> A1
  45. </form>
  46.  
  47. <?php
  48. try
  49. {
  50. $stmt = $pdo->prepare("SELECT o.miasto,o.id_kategoria,p.id_ogloszenia,p.id_prawo_jazdy FROM ogloszenia o LEFT OUTER JOIN pj p on o.id=p.id_ogloszenia WHERE ". implode( ' AND ', $where )." group by o.id order by o.id DESC");
  51. $stmt->execute( $bind );
  52. while($ogloszenia = $stmt -> fetch())
  53. {
  54. // WYSWIETLENIE TABELI Z DANYMI
  55. }
  56. $stmt -> closeCursor();
  57. }
  58. catch(PDOException $e)
  59. {
  60. print "Bład: " . $e->getMessage() . "<br/>";
  61.  
  62. }
  63.  
  64. ?>
peklo
a tam twój błąd cieszę się ,że mi w ogóle pomagasz smile.gif

no wreszcie jest bez błędów
zapamiętuje stan, wyszukuje i działa:)
Dzięki za zawrócenie czasu i wielką pomoc mam tylko jeszcze jedno pytanie.
Nie wiem czy tak powinno być i jak jest w innnych wyszukiwarkach , a mianowicie chodzi mi o jedną rzecz

Jak zaznaczę powiedzmy kat A ,B,C to wyszukuje mi rekord tylko z parametrem A lub B itd , a nie ABC
Chodzi pewnie o OR AND. I teraz nie wiem czy to jest prawidłowe czy nie
trueblue
Obydwie wersje są prawidłowe, to już od Ciebie zależy w jaki sposób chcesz selekcjonować wyniki.
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.