Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Problemy z zapytaniem
eFK
post
Post #1





Grupa: Zarejestrowani
Postów: 60
Pomógł: 0
Dołączył: 1.02.2014

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


Witam serdecznie

Mam dwie grupy checkbooxów jeden: name='status[]' i drugi name=miasto[].

Próbóję zrobić zapytanie niezależne od tego w której grupie chexkboxów wybierze sie jaką ilość odpowiedzie: znaczy w pierszej grupie można zaznaczyć np. 3, a w drugiej zero.

Mój kod obeznie wygląda tak:
  1. $ile=max(count($_POST['status']),count($_POST['miasto']));
  2.  
  3. for($i=0;$i<=$ile;$i++){
  4. if(!empty($_POST['status'])) $where[]=" f.status='".$_POST['status'][$i]."'";
  5. if(!empty($_POST['miasto'])) $inner[]=" AND a.miasto='".$_POST['miasto'][$i]."'";
  6.  
  7. if(!empty($where)) $where_str = " WHERE ".implode( " and ", $where );
  8. if(!empty($inner)) $inner_str = implode( " ", $inner );
  9.  
  10. $stmt ="SELECT f.id FROM firma f INNER JOIN adresy a ON f.id=a.idFirmy" .$inner_str .$where_str;
  11.  
  12. $stmt = $pdo->prepare($stmt);
  13.  
  14. $stmt -> execute();
  15. }
  16. foreach($stmt as $row){
  17. echo $row['id'].',';}


Wydaje mi się, że błąd jest w tym, że podczas przetwarzania pętli for wychodzą czasem puste wartości np.: $_POST['miast']='', przez co pytanie jest żle sformuowane i DB nie daje żadnego wyniku. I powiem szczerze, naprawdę nie mam już pomysłu jak to poprawić i gdzie szukać podpowiedzi.
System pokazuje mi błąd o niezdefiniowanych indexach: linia 1

undefine offset: linia 4

i jeszcze o niezdefiniowanych zmiennych, ale to raczej nei ma znaczenia.

Jakbym jakichś ważnych informacji nie udzieliła, pytajcie...

Ten post edytował eFK 15.12.2015, 17:41:16
Go to the top of the page
+Quote Post
Pyton_000
post
Post #2





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


Ale jak to ma działać, bo teraz to jest totalnie bez sensu. Zwracasz wyniki z ostatniego wygenerowanego zapytania.

Czy to ma działać tak że zapytanie ma spełniać wszystkie warynki z status i miasto?
Np. status = 1 AND status = 2 AND miasto = 'Pcim' AND miasto = 'Dolnik' (IMG:style_emoticons/default/questionmark.gif)


Jeśli tak to tu masz na szybko nie testowane.

  1. <?php
  2. $cities = array_map(function($city){
  3. return "'$city'";
  4. }, $_POST['miasto']);
  5.  
  6. $statuses = array_map(function($status){
  7. return "'$status'";
  8. }, $_POST['status']);
  9.  
  10. $statuses = implode(',', $statuses);
  11. $cities = implode(',', $cities);
  12.  
  13. $where = [];
  14. if(!empty($cities)) {
  15. $where[] = "a.miasto ALL ($cities)";
  16. }
  17. if(!empty($statuses)) {
  18. $where[] = "f.status ALL ($statuses)";
  19. }
  20.  
  21. $sql = 'SELECT f.id FROM firma f INNER JOIN adresy a ON f.id=a.idFirmy '.!empty($where) ? 'WHERE ' : '' . implode(' AND ', $where);
  22. $stmt = $pdo->prepare($stmt);
  23. $stmt->execute();
  24.  
  25. foreach($stmt as $row) {
  26. var_dump($row);
  27. }


Ten post edytował Pyton_000 15.12.2015, 20:28:31
Go to the top of the page
+Quote Post
eFK
post
Post #3





Grupa: Zarejestrowani
Postów: 60
Pomógł: 0
Dołączył: 1.02.2014

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


@Pyton_000 Dzięki za odpowiedz,

Tak chodzi właśnie o to to by zapytanie spełniało każdy warunek: mam dwie tabele, w jednej (firma) mam kolumne id i kolumne status, a w drugiej (adres) kolumnę idFirmy (taka sama jak kolumna firma.id) oraz kolunkę miasto. Tworzę checkboxy z których jedne to wszystkie dostępne stausy, a drugie to wszytkie dostepne miasta. I teraz zaznaczajac ile checkboxów się chce system wyszukuje id z pierwszej tabeli, które spełnia te wszytkie warunki.

Przy twoim rowiązaju dostaje komunikat Query was empty
Go to the top of the page
+Quote Post
Pyton_000
post
Post #4





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


No to zobacz sobie jakie wygenerowane jest zapytanie i sobie sprawdź
Go to the top of the page
+Quote Post
eFK
post
Post #5





Grupa: Zarejestrowani
Postów: 60
Pomógł: 0
Dołączył: 1.02.2014

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


eee, przyznam się że nie rozumiem z tym sprawdzaniem?(IMG:style_emoticons/default/questionmark.gif) ?

natomiast test w phpMyAdminie też wskazuje, że coś jest nie tak

Jeszcze raz bardzo proszę o pomoc. Próbowałam jeszcze raz rozbić wszytkie części zapytania na tablice, ale nadal nie działa dobrze. Zresztą domyślam się że da się to zrobić prościej, ale nie do końca rozumiem to co mi zaproponował Pyton_000. Przede wszystkim tam do zapytania trafia array, aie włożone do niego elementy. poza tym to wszytko właśnie odpócz tej części
'SELECT f.id FROM firma f INNER JOIN adresy a ON f.id=a.idFirmy '.!empty($where) ? 'WHERE ' : '' . implode(' AND ', $where);

rozumiem, ale wydaje mi się, że podstawianie pod to tylko ALL(coś tam, coś tam) nic nie da i dlatego zapytanie jest puste, ale nie mam zielonego pojęcia jak to zmienić. Jestem dopiero na etapie uczenia się i nawet doczytanie o podzapytaniach nic mi nei pomogło...
Go to the top of the page
+Quote Post
Pyton_000
post
Post #6





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


No to pochwal się zapytaniami jakie zostały wygenerowane.
Go to the top of the page
+Quote Post
eFK
post
Post #7





Grupa: Zarejestrowani
Postów: 60
Pomógł: 0
Dołączył: 1.02.2014

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


Mam ten kod :-) Działa idealnie. Pyton_000 bardzo dzoękuje za wskazówki.

Temat do usunięcia
Go to the top of the page
+Quote Post
Pyton_000
post
Post #8





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


Nic nie do usunięcia. Jakby każdy chciał tak usuwać to by się człowiekowi znudziło odpowiadanie 10000x na to samo.

Czyli co. Mój kod działa czy przerobiłeś i masz swój który działa? Jeśli przerabiałeś to podaj go tu, ktoś kiedyś na pewno z niego skorzysta.
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 23.08.2025 - 15:51