Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Budowa zapytania MySQL na podstawie formularza
Forum PHP.pl > Forum > PHP
bebzon_hc
Witam!
Mam pytanie... bo stoję w kropce. Mam formularz za pomocą którego muszę zbudować zapytanie do bazy danych. W zależności które z 4 kryteriów wyszukiwania użytkownik włączy w formularzu to php ma dodać np. LIKE "xxxx" .
Wygląda to mniej więcej tak:

  1. $dbh->connectDB();
  2. $dbResult = "@mysql_query(\"
  3. SELECT DATE_FORMAT(oc.date, '%d-%m-%Y') AS date, DATE_FORMAT(oc.date, '%H:%i') AS time, u.name, u.surname, c.firm_name, m.module_name, oc.edition_number, oc.newspapers
  4. FROM orders_current AS oc
  5. INNER JOIN users AS u ON oc.users_id_user = u.id_user
  6. INNER JOIN clients AS c ON oc.clients_id_client = c.id_client
  7. INNER JOIN modules AS m ON oc.modules_id_module = m.id_module
  8. WHERE ";
  9.  
  10. if (!empty($_POST['on_off_name'])) { $dbResult .= "u.name LIKE '%XXX%'"; };
  11. if (!empty($_POST['on_off_nip'])) { $dbResult .= "oc.nip LIKE 'XXX'"; };
  12. if (!empty($_POST['on_off_date'])) { $dbResult .= "oc.date LIKE 'XXX%'"; };
  13. if (!empty($_POST['on_off_user'])) { $dbResult .= "u.user LIKE 'XXX'"; };
  14.  
  15. $dbResult .= ";\")";
  16. $dbh->releaseDB();


Wszystko ładnie i pięknie ale gdzieś tutaj muszę wsadzić "AND". Bo co gdy ktoś wybierze dwa kryteria np. NAME i USER albo NIP i USER albo wybierze trzy kryteria. Ogólnie musi to działać na wszystkie kombinacje.

Jakieś wskazówki?

Pozdrawiam
adamec
musisz utworzyć dymaniczne zapyanie SQL czyli będzie się dodawać odpowiedni AND w zalezności od tego co wybierze uzytkownik . sprawdzasz poprostu co wybrał i doklejasz do zapytania SQL odpowiedni ciąg dalszy po WHERE
bebzon_hc
niechiałbym być nie wdzięczny hehe ale na tyle to sam wpadłem. Tylko jak to zrobić...
redeemer
Najłatwiej to skorzystać z tablic:
  1. $where = array();
  2.  
  3. if (!empty($_POST['on_off_name'])) { $where[] = "u.name LIKE '%XXX%'"; };
  4. if (!empty($_POST['on_off_nip'])) { $where[] = "oc.nip LIKE 'XXX'"; };
  5. if (!empty($_POST['on_off_date'])) { $where[] = "oc.date LIKE 'XXX%'"; };
  6. if (!empty($_POST['on_off_user'])) { $where[] = "u.user LIKE 'XXX'"; };
  7.  
  8. $dbResult .= implode(' AND ', $where);
adamec
no to jak rozumiesz idee , to czego nie wiesz ? Jak skleić string1 + string2 aby wyszedł string 3 ? Opisz dokładnie czego nie wiesz ? Czy poprostu chodzi ci o kotowy kod ?

tu masz kawełk kodu z podobnego problemu , przeanalizuj to
  1. if($_POST['BPG'] )
  2. {
  3. $sql="SELECT BPG_BPGID FROM BRANZAPODGRUPA WHERE BPG_NAZWA LIKE '".$_POST['branza']."'";
  4. $res=mysql_query($sql) or die ("blad sql nr:".mysql_errno()." ".mysql_error() );
  5. $branza=mysql_fetch_row($res);
  6. $szukaj=$szukaj." FIRMA.BPG_BPGID='".$branza[0]."' AND";
  7. $sposob='N';
  8. $opis=$branza[0];
  9.  
  10. }
  11. if($_POST['miasto'] )
  12. {
  13. //$sql="SELECT FIRMA.FIR_NAZWA FROM ADRES,FIRMA WHERE ADRES.ADR_MIASTO='".$_POST['miasto']."' AND ADRES.FIR_FIRID=FIRMA.FIR_FIRID";
  14. //$res=mysql_query($sql) or die ("blad sql nr:".mysql_errno()." ".mysql_error() );
  15. // $row=mysql_fetch_row($res);
  16. if ($_POST['radiobutton']=='poczatek')
  17. {
  18. $szukaj=$szukaj." ADRES.ADR_MIASTO='".$_POST['miasto']."' AND";
  19. $sposob='A';
  20. $opis=$_POST['miasto'];
  21. }
  22. else
  23. {
  24. $szukaj=$szukaj." ADRES.ADR_MIASTO LIKE '%".$_POST['miasto']."%' AND";
  25. $sposob='A';
  26. $opis=$_POST['miasto'];
  27. }
  28. }
bebzon_hc
adamec smile.gif oboje znamy idee tylko Ty nie wiesz jaki mam problem. Jak się wgłębić w to mój problem skupia się na tym jak zrobić, żeby nie zależnie od ilości wybranych kryteriów wrzucić AND tylko i wyłącznie między $_POST['XXX'] a nie samym początku i samym końcu klauzuli WHERE. Propozycji "redeemer" nie próbowałem jesczze ale wydaje się być trafna. Dziękuję.

P.S Adamec Twoje rozwiązanie też da dobry wynik ale chyba jest bardziej inwazyjne w momencie zmian. Np. w przypadku dodania nowej kategorii.
adamec
a takie rozwiazanie

  1. if (!empty($_POST['on_off_name'])) { $dbResult .= "u.name LIKE '%XXX% AND' "; };
  2. .....
  3. .....
  4. .....
  5. else { $dbResult .= "1=1'"; };
bebzon_hc
heheh sprytne z tym 1=1 tylko powinno być poprostu:
  1. if (!empty($_POST['on_off_name'])) { $dbResult .= "u.name LIKE '%XXX% AND' "; };
  2. if ..... ;
  3. if ..... ;
  4. if ..... ;
  5.  
  6. $dbResult .= "1=1'";


Musiałoby bezwzględnie dodawać 1=1 smile.gif

Ale chyba trochę nie łądnie tak co ?

Rozwiązanie redeemer'a chyba bardziej poprawne jest smile.gif
adamec
ano dokładnie bezwględnie musi dodać na końcu 1=1
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.