Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP][MySQL]zapytanie mysql pobiera za duzo danych
amdziak
post
Post #1





Grupa: Zarejestrowani
Postów: 36
Pomógł: 1
Dołączył: 2.01.2012

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


Witam,

mam sobie formularz wyszukiwania danych w bazie i zauważyłem, że zapytanie pobierające dane rozszerzone o 10 nowych pól pobiera za każdym razem pobieraz mi wszytskie rekordy z bazy ;/

dane z formularza pobieram, tak:

  1. $imie=addslashes(($_POST['imie']));
  2. $nazwisko=addslashes(($_POST['nazwisko']));
  3. $dzien_urodzenia=addslashes(($_POST['dzien_urodzenia']));
  4. $miesiac=addslashes(($_POST['miesiac']));
  5. $rok=addslashes(($_POST['rok']));
  6. $ojciec=addslashes(($_POST['ojciec']));
  7. $matka=addslashes(($_POST['matka']));
  8. $miejsce=addslashes(($_POST['miejsce']));
  9. $przebieg=addslashes(($_POST['przebieg']));
  10. $przydzial=addslashes(($_POST['przydzial']));
  11. $pseudonim=addslashes(($_POST['pseudonim']));
  12. $stan_cywilny=addslashes(($_POST['stan_cywilny']));
  13. $stopien=addslashes(($_POST['stopien']));
  14. $sygnatura=addslashes(($_POST['sygnatura']));
  15. $wyznanie=addslashes(($_POST['wyznanie']));
  16. $zawod=addslashes(($_POST['zawod']));


Natomiast zapytanie wygląda następująco:

  1. $q = mysql_query("SELECT * FROM legionisci
  2. WHERE imie like '$imie%' OR
  3. nazwisko like '$nazwisko%' OR
  4. dzien_urodzenia = '$dzien_urodzenia%' OR
  5. miesiac_urodzenia = '$miesiac%' OR
  6. rok_urodzenia = '$rok%' OR
  7. imie_ojca like '$ojciec%' OR
  8. imie_matki like '$matka%' OR
  9. przebieg_sluzby like '$przebieg%' OR
  10. przydzial like '$przydzial%' OR
  11. pseudonim like '$pseudonim%' OR
  12. stan_cywilny like '$stan_cywilny%' OR
  13. stopien_wojskowy like '$stopien%' OR
  14. sygnatura like '$sygnatura%' OR
  15. wyznanie like '$wyznanie%' OR
  16. zawod like '$zawod%'")OR die('Blad zapytania');


Gdzie jest błąd?
Struktura tabeli wygląda tak:

  1. CREATE TABLE IF NOT EXISTS `legionisci` (
  2. `nazwisko` varchar(80) DEFAULT NULL,
  3. `imie` varchar(35) DEFAULT NULL,
  4. `pseudonim` varchar(106) DEFAULT NULL,
  5. `wyznanie` varchar(25) DEFAULT NULL,
  6. `rok_urodzenia` varchar(13) DEFAULT NULL,
  7. `miesiac_urodzenia` varchar(17) DEFAULT NULL,
  8. `dzien_urodzenia` varchar(15) DEFAULT NULL,
  9. `miejsce_urodzenia` varchar(62) DEFAULT NULL,
  10. `imie_ojca` varchar(31) DEFAULT NULL,
  11. `imie_matki` varchar(91) DEFAULT NULL,
  12. `zawod` varchar(90) DEFAULT NULL,
  13. `stan_cywilny` varchar(54) DEFAULT NULL,
  14. `stopien_wojskowy` varchar(59) DEFAULT NULL,
  15. `przydzial` varchar(282) DEFAULT NULL,
  16. `przebieg_sluzby` varchar(1632) DEFAULT NULL,
  17. `uwagi` varchar(1724) DEFAULT NULL,
  18. `sygnatura` varchar(259) DEFAULT NULL
  19. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;


Z góry dziękuję za wszelkie odpowiedzi i sugestie! smile.gif

Pozdrawiam,
amdziak
Go to the top of the page
+Quote Post
irmidjusz
post
Post #2





Grupa: Zarejestrowani
Postów: 279
Pomógł: 60
Dołączył: 25.02.2012

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


Nie ma żadnego błędu, Twoje zapytanie po prostu pobiera wszystkie rekordy, bo klauzula where obejmuje wszystkie wiersze. Wystarczy, że jakaś zmienna z POSTa jest pusta, to dostajesz "kolumna like '%'" - czyli dowolna wartość w tej kolumnie przejdzie, a w where wszystkie warunki są połączone OR więc dla każdego wiersza będzie to spełnione.


--------------------
there is much to be learned
Go to the top of the page
+Quote Post
amdziak
post
Post #3





Grupa: Zarejestrowani
Postów: 36
Pomógł: 1
Dołączył: 2.01.2012

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


Więc jak sformułować zapytanie, aby dla dowolnego pola, albo kilku było ok?

Dzięki za szybką odpowiedź
Go to the top of the page
+Quote Post
irmidjusz
post
Post #4





Grupa: Zarejestrowani
Postów: 279
Pomógł: 60
Dołączył: 25.02.2012

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


Te warunki OR dodawaj tylko jeśli odpowiednia zmienna z POSTa nie jest pusta.


--------------------
there is much to be learned
Go to the top of the page
+Quote Post
nospor
post
Post #5





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Po pierwsze, to chyba pomyliła ci sie logika. Powiedzmy ze ktos w pole imie wpisaj JAN, w nazwisko KOWALSKI. To wg. Ciebie szukka kogos o imieniu JAN lub nazwisku KOWALSKI, a raczej jest tak, ze ktos wowcza szuka kogos o imieniu JAN i nawisku KOWALSKI.
Zamiast OR powinno byc AND

Po drugie, jak juz wpsomniano, warunki w mysql masz tworzyc dopiero gdy dane pole jest wypelnione
http://nospor.pl/wyszukiwarka-zapytanie-za...d-warunkow.html

ps: znasz jeszcze jakies inny typy niz VARCHAR?


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
amdziak
post
Post #6





Grupa: Zarejestrowani
Postów: 36
Pomógł: 1
Dołączył: 2.01.2012

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


Dzięki - o to chodziło smile.gif
faktycznie, powinny byc and'y zamiast or'ow...

Oczywiście, że znam i to bardzo wiele, ale że to jest jakaś importowana baza to pola poszły najmniej inwazyjne, czyli varchary, chociaż wolałbym varchar2 biggrin.gif

mam pytanie:
dlaczego zapytanie zalezne od warunku nie dziala mi z like?

  1. $wh = array(); //inicjalizujemy tablic z warunkami
  2. if (!empty($_POST['imie'])) //i podano
  3. $wh[] = "imie like '$_POST[imie]' ";
  4.  
  5. if (!empty($_POST['nazwisko'])) //je podano nazwisko
  6. $wh[] = "nazwisko like '$_POST[nazwisko]' ";
  7.  
  8. if (!empty($_POST['rok'])) //jeli podano zakres dolny wieku
  9. $wh[] = "rok_urodzenia >= $_POST[rok]";
  10.  
  11. if (!empty($_POST['rok2'])) //jeli podano zakres gĂłrny wieku
  12. $wh[] = "rok_urodzenia <= $_POST[rok2]";
  13.  
  14. if (!empty($wh))
  15. $where = 'where '.implode(' and ', $wh);
  16. else
  17. $where = '';
  18. $sql = 'select * from legionisci '.$where;
  19. $q = mysql_query($sql)or die('Blad zapytania');


pytanie jest niewazne:
wszystko bylo, ok - wyswietlilem sobie zapytanie echem i zobaczylem, ze brakuje '%' ;/

Dzięki jeszcze raz wszystkim za pomoc! 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: 20.08.2025 - 09:38