Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wyszukiwarka
Forum PHP.pl > Forum > Bazy danych > MySQL
djluzio
Kto mi podsunie pomysl jak stworzyc wyszukiwarke? Zakladajmy ze bedzie to wyszukiwarka ofert motoryzacyjnych. Uzytkownik wypelnia formularz i zostaje przeniesiony do innej strony na ktorej sa pokazane wszystkie wyniki. Chodzi mi tylko o to jak zrobic zapytania do bazy w zaleznosci od tego co wybierze. Jesli np. wybierze tylko marke i model a reszta bedzie dowolna to jak mam zrobic zapytanie? Moze byc tak?
  1. <?php
  2.  
  3. if($marka<>'' AND $model<>'') { 
  4. $query = mysql_query(&#092;"SELECT * FROM $oferty WHERE marka='$marka' AND model='$model'\");
  5. $dane = mysql_num_rows($query);
  6. }
  7.  
  8. ?>

Cze mam rozpatzryc wszystkie mozliwosci wyboru? Jesli mam w formularzu zapytania 10 roznych opcji do wyboru to kombinacja wszystkich bedzie mega wielka, a nie chce pisac dla kazdej innego zapytania bo mi 10 stron nie wystarczy.
Jak do tego podejsc?

Formularz bedzie sie skladal glownie z selectow typu:
  1. <?php
  2.  
  3. <select name=&#092;"marka[]\">
  4. <option value=&#092;"\">------dowolna---
  5. <option value=&#092;"audi\">audi
  6. <option value=&#092;"bmw\">bmw
  7. <option value=&#092;"opel\">opel
  8. </select>
  9.  
  10. ?>


Jak porobic zapyania w zaleznosci od tego co zostanie wybrane w jak najprostszy sposob?

Mysle ze pomysl jest banalny i wystarczy jedno zapytanie ale dopiero wstalem i nie mysle jeszcze.
Dziekuje za pomoc
fones
Mysle ze ten pierwszy kod jest ok, tylko po co Ci nazwa tabeli w zmiennej questionmark.gif?

pozdro guitar.gif
djluzio
A co bedzie jak wybierze tylko model a marke pozostawi pusta? Wtedy nic nie znajdzie bo bedzie szukac rekordow w ktorych komorka marka jest pusta (albo bedzie 0 bo zmienna bedzie pusta)

Nazwa zmiennej jest dlatego ze w konfigu sa zdeklarowane rozne nazwy tabel.
fones
to zadeklaruj w if i bedzie ok, jak wybierze jedno to niech szuka tylko jednego... kilka linijek wiecej... (P.S. Jak wybierze jedno to nie zadziala tamten skrypt, bo instrukcja warunkowa jej nie przepusci, dlatego proponuje ifelse)

pozdro guitar.gif
djluzio
Dzieki tak tez mozna zrobic. Ale jak masz jeszcze zalozny pola rok, przebieg, cena to juz masz tych kombinacji w cholere. np:
  1. <?php
  2.  
  3. if($model<>'' AND $marka<>'' AND $cena<>'' AND $przebieg<>'') {
  4. //zapytanie
  5. }
  6. if($model<>'' AND $rok<>'' AND $cena<>'' AND $przebieg<>'') {
  7. //zapytanie
  8. }
  9. if($model<>'' AND $rok<>'' AND $cena<>'') {
  10. //zapytanie
  11. }
  12. if($model<>'' AND $marka<>'' AND $cena<>'') {
  13. //zapytanie
  14. }
  15. ?>


wyobrazasz sobie ile jest kombinacji jak z formularza mozna wybrac z 15 pozycji?
Przypuszcza ze ze 100 conajmniej...
fones
życie ;p
djluzio
blink.gif
heheh no wlasnie...lipa....
ale na pewno jak jakis pomysl bo na stronachj jest duzo takich wyszukiwarek i dzialaja szybko a gdyby kod byl dlugi to by pewnie to trwalo wiecznie...
tumczasty
mój pomysł jest taki:
  1. <?php
  2. $kryteria=array('marka','model','cena','przebieg');
  3. $zapyt=array();
  4. foreach($kryteria as $kryt) if($_GET[$kryt]<>'') $zapyt[]=&#092;"$kryt='\".$_GET[$kryt].\"'\";  //ew. $_POST[...]
  5. if(count($zapyt)) $zapytanie=' WHERE '.implode(' AND ',$zapyt);
  6. $query = mysql_query(&#092;"SELECT * FROM $oferty$zapytanie\");
  7. (...)
  8. ?>
djluzio
Cos jest skopane w tym co mi napiales ale pomysl jest bardzo dobry?
Moze mi ktos to poprawic?

zapytanie ma taka postac:
  1. WHERE typ='Array' AND region='Array' AND wojewodztwo='Array'


Co oznacza
  1. <?php
  2. $_GET[$kryt]
  3. ?>
?
tumczasty
sam jesteś skopany tongue.gif
drobna zmiana we wszystkich selectach itp. i powinno działać:
  1. <select name="marka">
  2. <option value="">------dowolna---
  3. <option value="audi">audi
  4. <option value="bmw">bmw
  5. <option value="opel">opel

czyli w pierwszej linijce NAME ma być "marka", nie "marka[]"

$_GET to tablica, która zawiera wszystkie zmienne z formularza wysłane metodą GET; lepiej używać np. $_GET['marka'] niż $marka
djluzio
Wlasnie zauwazylem ze jestem niezle skopany:)
Dziala idealnie i juz nie potrzebuje tysiaca ifów tylko kilka linijek.
Jak byś mial ochote mi jeszcze poradzic to mam ostatni problem (oczywiscie dla mnie zatrudny) taki ze jednym z selektow jest 'cena' i do tych wszystkich warunkow musze dodac cene tak zeby wyszukiwalo WHERE cena<='$cena. A ze dla mnie tablice to czarna magia wiec nie wymysle tego. Czyli mowiac na chlopski rozum ostatni warunke musi byc <= a nie =. Tak w ogole to dzieki za tamto. Zaoszczedzilem dzieki Tobie z tydzien czasu rolleyes.gif

dzieki za wyjasnienie...musialem uzyc $_POST bo wysylam przez posta.

zapyatnie musi wygladac mniejwiecej tak:
  1. $query = mysql_query("SELECT * FROM $oferty WHERE marka='$marka' AND model='$model' AND cena<='$cena'");

Pewnie potrzeba jakiegos ifa czy cos....
tumczasty
biggrin.gif
  1. <?php
  2. $kryteria=array('marka','model','cena','przebieg');
  3. $zapyt=array();
  4. foreach($kryteria as $kryt) if($_POST[$kryt]<>'') $zapyt[]=&#092;"$kryt='\".$_POST[$kryt].\"'\";
  5. if(count($zapyt)) $zapytanie=' WHERE '.implode(' AND ',$zapyt);
  6. if($_POST['cena']) if($zapytanie!='') $zapytanie.=' AND cena<='.$_POST['cena']; else $zapytanie=' WHERE cena<='.$_POST['cena'];
  7. $query = mysql_query(&#092;"SELECT * FROM $oferty$zapytanie\");
  8. ?>
djluzio
zaraz przetestuje i dam Ci znac czy hula niezle

tworzy takie zapytanie...przedstawiam koncowke:
  1. AND cena='1000' AND cena<=1000
tumczasty
malusieńki błąd (zdarza się najlepszym aarambo.gif )
bo teraz trzeba jeszcze usunąć "cenę" z tablicy $kryteria, żeby się nie robiło:
  1. ...AND cena='1000' AND...

i jeszcze drobne ulepszenie i będzie tak:
  1. <?php
  2. $zapyt=array();
  3. $kryteria=array('marka','model','przebieg');
  4. foreach($kryteria as $kryt) if($_POST[$kryt]<>'') $zapyt[]=&#092;"$kryt='\".$_POST[$kryt].\"'\";
  5. if($_POST['cena']) $zapyt[]='cena<='.$_POST['cena'];
  6. if(count($zapyt)) $zapytanie=' WHERE '.implode(' AND ',$zapyt);
  7. $query = mysql_query(&#092;"SELECT * FROM $oferty$zapytanie\");
  8. ?>

pozdrawiam
Mery
Jam mam takie pytanie zwiazane w sumie z wyszukiwarka. Chodzi mi o to zeby znalezc wszystkie rekordy ktore w danym polu zawieraja jakis text. Nie ze rowna sie tylko zawiera tongue.gif. Jest jakis sposob zeby zadac takie zapytanie questionmark.gif Bo zrobilem to przetwarzajac rekordy whil'em i uzywajac eregi() ale to mi strasznie komplikuje sprawe i uniemozliwia kilka innych rzeczy sad.gif
tumczasty
spróbuj:
  1. SELECT * FROM tabela WHERE pole1 LIKE '%szukanytekst%'
Mery
dzieki bardzo, dziala elegancko i jeszcze pomija wielkosc liter biggrin.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-2024 Invision Power Services, Inc.