Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Problem z selectem
di@blo
post
Post #1





Grupa: Zarejestrowani
Postów: 94
Pomógł: 0
Dołączył: 9.03.2005

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


mam takie zapytanie

  1. $wykonaj = mysql_query("SELECT * FROM sprzet WHERE (nazwa LIKE '%$nazwa%') AND (opis LIKE '%$opis%') AND (firma LIKE '%$firma%') AND (kolor='$kolor') ");


gdy sie poda w formularzu wszystko tj nazwa, opis, firma, kolor to wszystko dziala ok ale jesli ktores z pol zostaje niewypelnione (a użytkownik musi miec taka mozliwosc) to mimo ze pozostale wartosci znajduja sie w bazie nie zwraca nic Jesli ktos wie jak to rozwiazac to bylbym wdzieczny Interesuja mnie rozwiazana w samym zapytaniu mysql oraz przez php

Ten post edytował batman 2.09.2008, 18:12:04
Powód edycji: nobody expects spanish inquisition
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 5)
Fixus
post
Post #2





Grupa: Zarejestrowani
Postów: 295
Pomógł: 9
Dołączył: 8.02.2006

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


problem zapewne wynika z tego, że kiedy UŻYTKOWNIK (pisownia polska nie jest taka trudna;P ) nie poda jakiejś wartości to zapytanie wyszukuje pól z pustymi ciągami znaków...przez to, że masz wszędzie AND to wygląda na tej zasadzie, że szuka pól gdzie opis czy tam firma jest pustym ciągiem znaków, a takowych nie znajduje bo jak sam napisałeś pozostałe wartości są w tabeli. Dlatego moja rada:
1. albo zamiast AND daj OR wtedy powinno działać
2. albo zrób sprawdzanie tego co jest zaznaczone i konstruuj w locie zapytanie
np:
Kod
$sql = "SELECT * FROM sprzet WHERE ";
if($_POST['nazwa'] != '') {
  $sql .= "nazwa LIKE '%nazwa%' AND";
}
if($_POST['opis'] != '') {
  $sql .= "opis LIKE '%opis%'";
.... // i tak dalej
Go to the top of the page
+Quote Post
di@blo
post
Post #3





Grupa: Zarejestrowani
Postów: 94
Pomógł: 0
Dołączył: 9.03.2005

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


nie jest trudna ale kazdemu sie zdazaja bledy ;p ale nie o tym tutaj Dzieki za rozwiazanie ale nie chodzi o to zeby je skopiowac tylko rozumiec o co chodzi.
W tym rozwiazaniu chodzi o to zeby posklejac zapytanie a pozniej dopiero go uzyc?

  1. $sql = "SELECT * FROM sprzet WHERE ";
  2. IF($_POST['nazwa'] != '') { $sql .= "nazwa LIKE '%nazwa%' AND"; }
  3. IF($_POST['opis'] != '') { $sql .= "opis LIKE '%opis%'"; }
  4.  
  5. mysql_query("$sql");


PS
nie do konca dziala bo jak mam
  1. nazwa LIKE '%nazwa%' AND";

i pozostale zmiene sa puste to przyczepia sie do 'AND' ale pracuje nad tym smile.gif jak by ktos mial proste rozwiazanie to moze sie podzielic bo nie chce za bardzo komplikowac kodu

Ten post edytował di@blo 2.09.2008, 20:21:31
Go to the top of the page
+Quote Post
Fixus
post
Post #4





Grupa: Zarejestrowani
Postów: 295
Pomógł: 9
Dołączył: 8.02.2006

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


tak chodzi o to żebyś posklejał zapytanie i go potem użył.
Też się kiedyś spotkałem z tym problemem co opisujesz. Możesz to zrobić na dwa sposoby. Jeden jest dość skomplikowany bo wymaga od ciebie szeregu instrukcji warunkowych które uwzględnią wszystkie możliwe przypadki.
drugi sposób jest taki
Kod
...
if($zmienna1 != '') { $sql .= "cos LIKE '%cos%' AND "; }
if($zmienna2 != '') { $sql .= "cos2 LIKE '%cos2%' AND "; }
$sql .= "jakies_pole != ''"; // może tu też być np: $sql .= "jakies_pole LIKE '$''$'";


może to nie jest zbyt eleganckie i nie powinno się tak robić, ale ja tak rozwiązałem ten problem kiedyś przy czymś tam pracując. Ogólnie rzecz polega na tym, że dajesz jakiś absurdalny warunek który będzie spełniony zawsze. Np. pole z identyfikatorem różne od pustego ciągu znaków. W ten sposób zamykasz zapytanie i nie zostaje ci to brzydkie AND na końcu smile.gif wydajności to nie obniża w żaden dostrzegalny dla przeciętnego śmiertelnika sposób. Kodu AŻ tak bardzo nie bruździ a spełnia swoje zadanie smile.gif

mam nadzieje, że nikt się nie zgorszy tym może trochę mało wyrafinowanym sposobem....on po prostu spełnia swoją rolę i nikomu nie wadzi tongue.gif
Go to the top of the page
+Quote Post
likemandrake
post
Post #5





Grupa: Zarejestrowani
Postów: 175
Pomógł: 17
Dołączył: 23.06.2006

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


Zawsze możesz to zrobić tak:

  1. <?php
  2. $sQuery = 'SELECT * FROM tabela';
  3. $aWhereStmt = array();
  4. if($zmienna1) {
  5. $aWhereStmt[] = "warunek1 = '" . mysql_real_escape_string($zmienna1) . "'";
  6. }
  7. if($zmienna2) {
  8. $aWhereStmt[] = "warunek2 = '" . mysql_real_escape_string($zmienna2) . "'";
  9. }
  10. if(sizeof($aWhereStmt) > 0) {
  11. $sQuery .= ' WHERE ' . join(' AND ', $aWhereStmt);
  12. }
  13. $sQuery .= ';';
  14. ?>


Cytat(di@blo @ 2.09.2008, 20:35:45 ) *
nie do konca dziala bo jak mam
  1. nazwa LIKE '%nazwa%' AND";

i pozostale zmiene sa puste to przyczepia sie do 'AND'


Najszybszy sposób na pozbycie się tego 'AND' w zlepionym zapytaniu, to skorzystanie z funkcji substr(). Można to zrobić tak:

  1. <?php
  2. $sQuery = substr($sQuery, 0, -4);
  3. ?>


Ten skrawek kodu wykonujesz, gdy zapytanie jest już praktycznie gotowe smile.gif


--------------------
serwiswww.pl
Go to the top of the page
+Quote Post
di@blo
post
Post #6





Grupa: Zarejestrowani
Postów: 94
Pomógł: 0
Dołączył: 9.03.2005

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


dzieki za pomoc smile.gif myslalem nad rozwiazaniami ale za bardzo komplikowaly kod

  1. $sQuery = substr($sQuery, 0, -4);


to w zupełności mi wystarczy smile.gif
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 Aktualny czas: 21.08.2025 - 11:31