Wyszukiwarka - zapytanie zależne od warunków

2008-06-23 19:53:47

 

Często piszemy wyszukiwarki. Jaka ich rola? Banalnie prosta - na podstawie zadanych kryteriów znaleźć żądane informacje. W tym celu tworzymy zapytanie, które zawiera nasze kryteria wyszukiwania. Zadanie wydaje się proste, jednak wielu początkujących programistów ma z tym problem. Bo o ile potrafią napisać zapytanie, które składa się ze stałej liczby warunków, o tyle z zapytaniem ze zmienną liczbą warunków, uzależnioną od wpisanych wartości w formularzu, mają już problem. W artykule tym postaram się Wam pomóc w oswojeniu tego zagadnienia.

Algorytm tworzenia zapytania ze zmiennym warunkami jest w miarę prosty. Pokażę go na przykładzie kodu napisanego w pseudo php:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
$wh 
= array(); //inicjalizujemy tablicę z warunkami
if ($warunek1//jeśli spełniony jakiś warunek1
   
$wh[] = 'jakiś warunek1'//dodajemy warunek sql
if ($warunek2//jesli spelniony jakis warunek2
   
$wh[] = '(jakiś warunek2 or jakis warunek 3)'//dodajemy jakis warunek sql
//..... i tak dalej

// jesli tablica warunków nie jest pusta, to tworzymy mysqlowy where, 
//który składa się z połączeń naszych warunków. 
//Warunki łączymy poprzez AND, gdyż tak zazwyczaj łączy się warunki przy wyszukiwarkach
if (!empty($wh))
   
$where 'where '.implode(' and '$wh);
else
   
$where ''//jesli nie było zadnych warunkow, to nasz where nie istnieje

//a teraz tworzymy nasze glowne zapytanie i łączymy je z naszymi warunkami
$sql 'select * from tabela '.$where;

//a tutaj juz sobie wykonujemy normalnie zapytanie
?>

No, to teraz skoro znamy już algorytm, przystąpmy do prawdziwej sytuacji. Załóżmy, że mamy formularz na wpisanie imienia, nazwiska i przedziału wiekowego.

1
2
3
4
5
6
7
<form method="post">
Podaj imię: <input type="text" name="name" />
Podaj nazwisko: <input type="text" name="surname" />
Podaj wiek od: <input type="text" name="age_from" />
Podaj wiek do: <input type="text" name="age_to" />
</form>

A teraz tworzymy zapytanie uwzględniające te kryteria wyszukiwania. Zapytanie to nie będzie uwzględniało zabezpieczeń przed różnymi atakami typu SQLInjection - nie chcę zaciemniać kodu dodatkowymi "bajerami".

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
$wh 
= array(); //inicjalizujemy tablicę z warunkami
if (!empty($_POST['name'])) //jeśli podano imię
   
$wh[] = "NAME = '$_POST[name]' "

if (!empty(
$_POST['surname'])) //jeśli podano nazwisko
   
$wh[] = "SURNAME = '$_POST[surname]' "

if (!empty(
$_POST['age_from'])) //jeśli podano zakres dolny wieku
   
$wh[] = "AGE >= $_POST[age_from]"

if (!empty(
$_POST['age_to'])) //jeśli podano zakres górny wieku
   
$wh[] = "AGE <= $_POST[age_to]"

if (!empty(
$wh))
   
$where 'where '.implode(' and '$wh);
else
   
$where '';

//a teraz tworzymy nasze glowne zapytanie i łączymy je z naszymi warunkami
$sql 'select * from tabela '.$where;

?>

I już. Tym oto sposobem możemy tworzyć dowolną liczbę kryteriów dla naszej wyszukiwarki i w miarę prosty sposób nimi zarządzać. Zapewne gdy już nabierzecie doświadczenia, wymyślicie jakieś własne lepsze mechanizmy, ale na początek metoda ta wydaje się być jedną z lepszych.

ps: pamiętajcie, że w implode tam gdzie mamy ' and ' znajdują się dwie spacje: jedna przed and, a druga po and ( [spacja]and[spacja] ). Jest to niezbędna konstrukcja by otrzymać prawidłowo zbudowany warunki zapytania.

 

Komentarze

 

Dodaj komentarz

 

Dostępne bbcode: b, u, i, color, size, quote, img, url, list, il (tylko w list), code, php, css, html, sql, js