Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Budowa zapytania MySQL na podstawie formularza
bebzon_hc
post 18.04.2012, 13:09:19
Post #1





Grupa: Zarejestrowani
Postów: 36
Pomógł: 1
Dołączył: 10.02.2011
Skąd: Rawicz

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


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

Ten post edytował bebzon_hc 18.04.2012, 13:10:40
Go to the top of the page
+Quote Post
adamec
post 18.04.2012, 13:19:57
Post #2





Grupa: Zarejestrowani
Postów: 30
Pomógł: 3
Dołączył: 18.04.2012
Skąd: Rybnik

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


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


--------------------
Jeżeli uda mi się pomóc Tobie to jestem usatysfakcjonowany . Wtedy Ty kliknij na POMÓGŁ
Go to the top of the page
+Quote Post
bebzon_hc
post 18.04.2012, 13:24:35
Post #3





Grupa: Zarejestrowani
Postów: 36
Pomógł: 1
Dołączył: 10.02.2011
Skąd: Rawicz

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


niechiałbym być nie wdzięczny hehe ale na tyle to sam wpadłem. Tylko jak to zrobić...
Go to the top of the page
+Quote Post
redeemer
post 18.04.2012, 13:25:29
Post #4





Grupa: Zarejestrowani
Postów: 915
Pomógł: 210
Dołączył: 8.09.2009
Skąd: Tomaszów Lubelski/Wrocław

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


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


Ten post edytował redeemer 18.04.2012, 13:26:09


--------------------
Go to the top of the page
+Quote Post
adamec
post 18.04.2012, 13:37:16
Post #5





Grupa: Zarejestrowani
Postów: 30
Pomógł: 3
Dołączył: 18.04.2012
Skąd: Rybnik

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


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


--------------------
Jeżeli uda mi się pomóc Tobie to jestem usatysfakcjonowany . Wtedy Ty kliknij na POMÓGŁ
Go to the top of the page
+Quote Post
bebzon_hc
post 18.04.2012, 13:42:26
Post #6





Grupa: Zarejestrowani
Postów: 36
Pomógł: 1
Dołączył: 10.02.2011
Skąd: Rawicz

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


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.

Ten post edytował bebzon_hc 18.04.2012, 13:51:37
Go to the top of the page
+Quote Post
adamec
post 18.04.2012, 13:50:09
Post #7





Grupa: Zarejestrowani
Postów: 30
Pomógł: 3
Dołączył: 18.04.2012
Skąd: Rybnik

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


a takie rozwiazanie

  1. if (!empty($_POST['on_off_name'])) { $dbResult .= "u.name LIKE '%XXX% AND' "; };
  2. .....
  3. .....
  4. .....
  5. else { $dbResult .= "1=1'"; };


--------------------
Jeżeli uda mi się pomóc Tobie to jestem usatysfakcjonowany . Wtedy Ty kliknij na POMÓGŁ
Go to the top of the page
+Quote Post
bebzon_hc
post 18.04.2012, 13:58:39
Post #8





Grupa: Zarejestrowani
Postów: 36
Pomógł: 1
Dołączył: 10.02.2011
Skąd: Rawicz

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


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

Ten post edytował bebzon_hc 18.04.2012, 14:01:44
Go to the top of the page
+Quote Post
adamec
post 18.04.2012, 14:09:16
Post #9





Grupa: Zarejestrowani
Postów: 30
Pomógł: 3
Dołączył: 18.04.2012
Skąd: Rybnik

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


ano dokładnie bezwględnie musi dodać na końcu 1=1


--------------------
Jeżeli uda mi się pomóc Tobie to jestem usatysfakcjonowany . Wtedy Ty kliknij na POMÓGŁ
Go to the top of the page
+Quote Post

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 Wersja Lo-Fi Aktualny czas: 20.06.2025 - 06:53