Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [mysql] Nie mam pomysłu na zapytanie dobre..., może ktoś pomoże
in5ane
post 8.05.2007, 17:59:45
Post #1





Grupa: Zarejestrowani
Postów: 1 335
Pomógł: 34
Dołączył: 9.11.2005
Skąd: Wrocław

Ostrzeżenie: (10%)
X----


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


--------------------
> > > Tworzenie stron < < <
Go to the top of the page
+Quote Post
Kicok
post 8.05.2007, 19:36:05
Post #2





Grupa: Zarejestrowani
Postów: 1 033
Pomógł: 125
Dołączył: 17.09.2005
Skąd: Żywiec

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


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.


--------------------
"Sumienie mam czyste, bo nieużywane."
Go to the top of the page
+Quote Post
Cienki1980
post 8.05.2007, 19:42:29
Post #3





Grupa: Przyjaciele php.pl
Postów: 1 590
Pomógł: 40
Dołączył: 11.01.2007
Skąd: Centrum

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


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.


--------------------
404
Go to the top of the page
+Quote Post
Kicok
post 8.05.2007, 19:44:26
Post #4





Grupa: Zarejestrowani
Postów: 1 033
Pomógł: 125
Dołączył: 17.09.2005
Skąd: Żywiec

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


W sumie jeśli ma być STATUS = '1' to można go użyć zamiast 1=1 ;]


--------------------
"Sumienie mam czyste, bo nieużywane."
Go to the top of the page
+Quote Post
in5ane
post 8.05.2007, 20:40:29
Post #5





Grupa: Zarejestrowani
Postów: 1 335
Pomógł: 34
Dołączył: 9.11.2005
Skąd: Wrocław

Ostrzeżenie: (10%)
X----


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?

Ten post edytował in5ane 8.05.2007, 20:43:58


--------------------
> > > Tworzenie stron < < <
Go to the top of the page
+Quote Post
Cienki1980
post 8.05.2007, 21:34:41
Post #6





Grupa: Przyjaciele php.pl
Postów: 1 590
Pomógł: 40
Dołączył: 11.01.2007
Skąd: Centrum

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


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


--------------------
404
Go to the top of the page
+Quote Post
in5ane
post 9.05.2007, 06:11:42
Post #7





Grupa: Zarejestrowani
Postów: 1 335
Pomógł: 34
Dołączył: 9.11.2005
Skąd: Wrocław

Ostrzeżenie: (10%)
X----


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.

Ten post edytował in5ane 9.05.2007, 06:26:15


--------------------
> > > Tworzenie stron < < <
Go to the top of the page
+Quote Post
Cienki1980
post 9.05.2007, 07:22:59
Post #8





Grupa: Przyjaciele php.pl
Postów: 1 590
Pomógł: 40
Dołączył: 11.01.2007
Skąd: Centrum

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


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 )


--------------------
404
Go to the top of the page
+Quote Post
Kicok
post 9.05.2007, 07:26:32
Post #9





Grupa: Zarejestrowani
Postów: 1 033
Pomógł: 125
Dołączył: 17.09.2005
Skąd: Żywiec

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


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


--------------------
"Sumienie mam czyste, bo nieużywane."
Go to the top of the page
+Quote Post
in5ane
post 9.05.2007, 15:15:45
Post #10





Grupa: Zarejestrowani
Postów: 1 335
Pomógł: 34
Dołączył: 9.11.2005
Skąd: Wrocław

Ostrzeżenie: (10%)
X----


Wielkie dzięki smile.gif


--------------------
> > > Tworzenie stron < < <
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: 24.06.2025 - 20:25