Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [mysql] Nie mam pomysłu na zapytanie dobre...
Forum PHP.pl > Forum > Przedszkole
in5ane
Witam, nie mam pomysłu na dobre zapytanie, może mógłby mi ktoś pomóc.

Struktura formularza:
Nick (tekstowe)
Wiek pomiędzy (lista rozwijana) a (lista rozwijana)
Płeć (lista rozwijana)
Miejscowość (tekstowe)
Cel ogłoszenia (lista rozwijana)
Kolor oczu (lista rozwijana)
Kolor włosów (lista rozwijana)
Długość włosów (lista rozwijana)

Nie wszystkie pola muszą być wypełnione.
Aha i ma uwzględnić, żeby wyszukiwać osoby tylko ze statusem równym 1 czyli STATUS = '1'

Z góry dziękuję za pomoc. Najlepiej jakby to miało ręce i nogi.
Po prostu nie wiem jak to za bardzo dobrze stworzyć.
Kicok
Zakładam, że chodzi ci o pobranie danych z bazy spełniających kryteria z formularza. Jeśli tak to:
- Zapisujesz sobie do zmiennej początek zapytania, np. "SELECT * FROM tabela WHERE"
- Sprawdzasz wszystkie pola formularza i jeśli nie są puste/domyślne to dodajesz nowy warunek do tego zapytania, np. "(gender = 'f') AND "
- W razie potrzeby usuwasz " AND " odstające na końcu zapytania, żeby zachować poprawną składnię.
- Możesz jeszcze dodać jakiś ORDER BY czy LIMIT i zapytanie jest gotowe do użycia.
Cienki1980
Jako uzupełnienie tego co napisał Kicok zrobiłbym takie zapytanie:
select * from tabela where 1=1 a potem tak samo sprawdzałbym, czy dane przesyłane z formularza są inne niż puste/domyślne.

Jeżeli tak to do zapytania dodajesz wartość " AND nazwa_kolumny=$wartosc_z_formularza".

W ten sposób nie będziesz musiał potem sprawdzać, czy na końcu zapytania nie ma AND i go usuwać.

EDIT: Oczywiście Kicok ma rację biggrin.gif można wykorzystać status=1 zamiast 1=1.
Kicok
W sumie jeśli ma być STATUS = '1' to można go użyć zamiast 1=1 ;]
in5ane
Ale ja pisałem (jeżeli nie to teraz pisze), że nie trzeba wypełnić wszystkich pół, to co wtedy?

Jak zrobię coś takiego:
SELECT * FROM users WHERE status = '1' AND nick LIKE '$nick' AND wiek BETWEEN '$wiek1' AND '$wiek2' AND plec = '$plec' AND miejscowosc = '$miejscowosc' AND cel = '$cel' AND kolor_oczu = '$kolor_oczu' AND kolor_wlosow = '$kolor_wlosow' AND dlugosc_wlosow = '$dlugosc_wlosow'

To będzie poprawnie?
I wyświetli dobrze wszystko jeżeli ktoś nie wpisze (wybierze) jakieś pole?
Cienki1980
Przeczytaj dokładnie to co napisał Kicok w swojej pierwszej odpowiedzi a dokładnie to co jest po drugim myślniku.

Tam masz odpowiedź na swoje pytanie i tak powinieneś to zrobić.
in5ane
Czy tak?

SELECT * FROM users WHERE status = '1', nick LIKE '$nick', wiek BETWEEN '$wiek1' AND '$wiek2', plec = '$plec', miejscowosc = '$miejscowosc', cel = '$cel', kolor_oczu = '$kolor_oczu', kolor_wlosow = '$kolor_wlosow', dlugosc_wlosow = '$dlugosc_wlosow' AND

Jak dodałem to to mi wyskoczył takie error:
Kod
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in C:\AppServ\www\str2(2)\szukaj.php on line 73
a ta linia to: mysql_num_rows($result) == 0 (to odpowiada za to, jak nie znajdzie żadnych wyników.
Cienki1980
Cytat(in5ane @ 9.05.2007, 07:11:42 ) *
Czy tak?

SELECT * FROM users WHERE status = '1', nick LIKE '$nick', wiek BETWEEN '$wiek1' AND '$wiek2', plec = '$plec', miejscowosc = '$miejscowosc', cel = '$cel', kolor_oczu = '$kolor_oczu', kolor_wlosow = '$kolor_wlosow', dlugosc_wlosow = '$dlugosc_wlosow' AND
....

Stanowczo nie tak. Widać nie do końca zrozumiałeś jak powinno to wyglądać. Oto krótki przykład pisany bardzo schematycznie.
  1. <?php
  2. $search_query='';
  3. if($_POST['nick']!='')
  4.  $search_query.=" AND nick='".$_POST['nick']."'";
  5. if($_POST['cel']!='')
  6.  $search_query.=" AND cel='".$_POST['cel']."'";
  7.  
  8.  
  9. $query="select * from tabela where status=1".$search_query;
  10. ?>


I tak robisz dla każdego pola z formularza. Musisz pamiętać że sprawdzenie ma nie być na sztywno !='' ( różne od pustego ) ale sprawdzasz czy jest dane pole ustawione ( czy jest różne od pola domyślnego - a jakie jest pole domyślne to chyba powinieneś wiedzieć w końcu sam pisałeś formularz )
Kicok
Po pierwsze to jeśli jakieś zapytanie nie za bardzo chce działać, to stosuj taki zapis:
  1. <?php
  2. $result = mysql_query('JAKIEŚ_ZAPYTANIE') or die(mysql_error());
  3. ?>

Dzięki temu w oknie przeglądarki pojawi się jeden, trochę bardziej czytelny błąd. Więcej informacji tutaj: musql_error" title="Zobacz w manualu PHP" target="_manual

Po drugie napisałem:
Cytat
Sprawdzasz wszystkie pola formularza i jeśli nie są puste/domyślne to dodajesz nowy warunek do tego zapytania

Czyli jeśli ktoś nie wypełni żadnego pola w formularzu, to powinieneś uzyskać takie zapytanie:
SELECT * FROM users WHERE status = '1'
Jeśli ktoś uzupełni jedno pole, to coś w rodzaju:
SELECT * FROM users WHERE status = '1' AND nick = '$nick'
Jeśli dwa pola, to coś w rodzaju:
SELECT * FROM users WHERE status = '1' AND nick = '$nick' AND kolor_oczu = '$kolor_oczu'
itd.

Po prostu sprawdzasz sprawdzasz czy dane pole tekstowe z formularza jest puste empty" title="Zobacz w manualu PHP" target="_manual. Co do tej wartości domyślnej, to chodziło mi o pola SELECT. Nie wiem jak je utworzyłeś, ale jeśli zrobiłeś coś w rodzaju:
Kod
<select name="plec">
  <option value="0">Wybierz płeć</option>
  <option value="1">Kobieta</option>
  <option value="2">Mężczyzna</option>
</select>

to sprawdzasz, czy $_POST['plec'] jest równe zero. Jeśli tak, to znaczy że użytkownik nie "wypełnił" tego pola, i nie dodajesz warunku do zapytania.


A teraz kilka szczegółów.
Po pierwsze to zapis: nick LIKE '$nick' wydaje mi się bez sensu. Jeśli chcesz znaleźć dokładnie takie nicki jak podany w formularzu, to użyj: nick = '$nick'. Jeśli natomiast chcesz znaleźć nicki podobne, to dodaj tam jeszcze znaczek procenta: nick LIKE '$nick%'. Więcej informacji tutaj: http://dev.mysql.com/doc/refman/5.0/en/str...l#operator_like
Po drugie zastanów się, czy na pewno warto używać zapisu: wiek BETWEEN '$wiek1' AND '$wiek2'. Co będzie, gdy użytkownik poda tylko $wiek1 albo tylko $wiek2. IMHO lepiej będzie rozbić to na dwa warunki: (wiek >= '$wiek1') AND (wiek <= '$wiek2')
in5ane
Wielkie dzięki 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.