Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problemy z zapytaniem
Forum PHP.pl > Forum > Bazy danych
eFK
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...
Pyton_000
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' 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. }
eFK
@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
Pyton_000
No to zobacz sobie jakie wygenerowane jest zapytanie i sobie sprawdź
eFK
eee, przyznam się że nie rozumiem z tym sprawdzaniem?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...
Pyton_000
No to pochwal się zapytaniami jakie zostały wygenerowane.
eFK
Mam ten kod :-) Działa idealnie. Pyton_000 bardzo dzoękuje za wskazówki.

Temat do usunięcia
Pyton_000
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.
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.