Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MySQL]zapytanie mysql pobiera za duzo danych
Forum PHP.pl > Forum > Przedszkole
amdziak
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
irmidjusz
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.
amdziak
Więc jak sformułować zapytanie, aby dla dowolnego pola, albo kilku było ok?

Dzięki za szybką odpowiedź
irmidjusz
Te warunki OR dodawaj tylko jeśli odpowiednia zmienna z POSTa nie jest pusta.
nospor
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?
amdziak
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
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.