Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySQL][PHP]wyszukiwarka z parametrem IN
peklo
post
Post #1





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

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


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'];
}
Go to the top of the page
+Quote Post
5 Stron V   1 2 3 > »   
Start new topic
Odpowiedzi (1 - 19)
trueblue
post
Post #2





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

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


http://stackoverflow.com/a/10722827


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


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





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

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


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


Ten post edytował trueblue 6.05.2014, 18:46:03


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


coś nie tak

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


Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING
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. $zap=str_repeat('?,',count($ids)-1). '?';


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


to mam teraz błąd

Warning: str_repeat() [function.str-repeat]: Second argument has to be greater than or equal to 0
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%)
-----


  1. $zap=str_repeat('?,',count($_POST['id_prawo_jazdy'])-1). '?';


Ten post edytował trueblue 6.05.2014, 19:03:48


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


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. }
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%)
-----


Tak, ten fragment do usunięcia.

Daj print_r($_POST['id_prawo_jazdy']); przed foreach i pokaż.


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


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

Ten post edytował peklo 6.05.2014, 19:15:44
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%)
-----


Nie modyfikujesz czasem wcześniej w kodzie zmiennej $_POST['id_prawo_jazdy'] ?
Pokaż wynik print_r, albo lepiej: var_dump($_POST['id_prawo_jazdy']);


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


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


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.


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


no właśnie nie wiem jak to wszystko połączyć + jeszcze bindowanie
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%)
-----


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?


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


  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" }

Ten post edytował peklo 6.05.2014, 19:56:01
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%)
-----


Jeśli to co podałeś to Twój "stary" kod, to musisz znaleźć różnicę, dlaczego ten zwraca tablicę, a nowy string.


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


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']);
Go to the top of the page
+Quote Post
trueblue
post
Post #20





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

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


To ja bym chciał zobaczyć co masz w $_POST['id_prawo_jazdy'] (var_dump), ale przed implodowaniem.


--------------------
Go to the top of the page
+Quote Post

5 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: 22.08.2025 - 07:39