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
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
?>
$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
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>
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>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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;
?>
$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.






kolo
2009-02-24 11:54:05