2011-02-16 16 views
5

Potrzebuję wskazówek, aby wykonać zaawansowany skrypt wyszukiwania dla strony, nad którą pracuję.Zaawansowany skrypt wyszukiwania PHP/MYSQL. W jaki sposób?

Już wiem, jak przeszukiwać bazę danych w poszukiwaniu prostych zapytań. Problem, który napotykam w tej chwili, to sposób wyszukiwania przy użyciu wielu pól wyboru. Na przykład:

enter image description here

To jest tylko prosty formularz z różnymi opcjami wyszukiwania. Pytanie brzmi:

Użytkownik może wybrać kraj lub miasto, obie lub nawet wszystkie trzy opcje.

Jak mogę to złapać w skrypcie PHP? Czy muszę sprawdzić, czy na przykład wybrano miasto, i odpalić zapytanie na podstawie tego? Ale jeśli to zrobię, będę musiał wykonać różne zapytania w oparciu o każdą wybraną opcję.

W pseudo-kod byłoby coś takiego: (I wyobrazić)

jeśli kraj i miasto, a coś innego nie jest null, uruchomić kwerendę, aby szukać we wszystkich trzech tabel w bazie danych.

Ale co zrobić, gdy tylko kraj został wybrany? A może po prostu miasto?

Czy istnieje prosty sposób, aby to osiągnąć?

Z góry dziękuję.

+1

Wygląda na to, że już odpowiedziałeś na własne pytanie. – diagonalbatman

+1

Cóż, prostym sposobem na osiągnięcie tego jest podłączenie czegoś takiego jak [Lucene] (http://framework.zend.com/manual/en/zend.search.lucene.overview.html) lub [Sphinx] (http: //sphinxsearch.com/), ale to może zależeć od twojej definicji pracy "prosta" :) –

+1

W twoim "pseudo-kodzie" wspominasz, że miasto i kraj są w osobnych tabelach. Czy to prawda?Czy są one oddzielnymi kolumnami w obrębie tej samej tabeli? Jeśli w rzeczywistości są w oddzielnej tabeli, musisz dołączyć do tabel, aby uzyskać ujednolicony zestaw wyników. – sholsinger

Odpowiedz

6

Lubię używać tablicy do łączenia warunków, więc nie muszę się martwić o prowadzenie lub śledzenie ORAZ.

$conditions = array(); 
if ($formCondition1) { 
    $conditions[] = 'state = "'.$somevalue.'"'; 
} 
if ($formCondition2) { 
    $conditions[] = 'country = "'.$somevalue.'"'; 
} 
... 
if ($formConditionN) { 
    $conditions[] = 'N = "'.$somevalue.'"'; 
} 

// wreszcie dołączyć warunki razem, najprostsza sprawa jest z AND (jeśli trzeba dodać RNO, który brzmi jak nie, to ten kod byłby nieco bardziej skomplikowane)

$sqlStatement = 'SELECT field1, field2 FROM tableABC WHERE '.implode(' AND ', $conditions); 

EDYCJA: nie zapomnij uciec przed wprowadzeniem, aby zapobiec atakom wtryskowym, i oczywiście przetestuj, aby upewnić się, że istnieje co najmniej jeden warunek przed uruchomieniem zapytania. EDYCJA: lol jswolf i myślę, że bardzo podobne :)

+0

Dziękuję bardzo za szczegółową odpowiedź. Myślę, że pójdę z tą odpowiedzią, nawet jeśli dwie pozostałe pracują również świetnie. Dziękuję wszystkim za pomoc! – moonwalker

4

chciałbym spróbować coś takiego:

$qry = "SELECT * FROM table WHERE "; 
if ($country != '') { 
    $qry .= "country='".mysql_real_escape_string($country)."' AND " 
} 
if ($city != '') { 
    $qry .= "city='".mysql_real_escape_string($city)."' AND " 
} 
$qry .= '1'; 
$res = mysql_query($qry); 

Zapytanie jest zbudowany w zależności od tego, co jest ustawione. Zwróć uwagę na "1" na końcu ciągu zapytania, który zawsze jest prawdziwy. Jest to konieczne, aby śledzić "GDZIEKOLWIEK", jeśli $ country i $ city są puste lub śledzić ostatnie "AND", jeśli nie są.

+0

Dziękuję bardzo za odpowiedź. Mam teraz 3 różne odpowiedzi, wszystkie działają i nie wiem, którego użyć. Dzięki jeszcze raz. – moonwalker

+0

Myślę, że jest to jedna z idealnych odpowiedzi na zaawansowaną koncepcję wyszukiwania. dziękuję za podzielenie się tym:) ... –

5

Wykonuję tablicę $where, w razie potrzeby dodam do niej moje warunki, a następnie implode z "AND" jako klejem. Więc coś takiego:

$where = array(); 
if $city is defined 
    $where[] = "city = '".mysql_real_escape_string($city)."'"; 
fi 
if $country is defined 
    $where[] = "country = '".mysql_real_escape_string($country)."'"; 
fi 
... 

if(count($where)) { 
    $query.= ' WHERE '.implode(' AND ', $where); 
} 
+0

Elegancki, podoba mi się. – sholsinger

+0

To bardzo prosty i elegancki wygląd. Dzięki! – moonwalker

+0

Tego właśnie szukałem! –

Powiązane problemy