Zalogowani on-line:
pomoc

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.

Kategorie MySQL php

Komentarze

kolo

2009-02-24 11:54:05

To dlaczego ty nie masz na swoim blogu wyszukiwarki ha??

nospor

2009-02-24 12:53:43

A jak to sie ma do tego artykułu? Ha??

Arty u mnie są podzielone na kategorie, więc raczej łatwo znaleźć to, czego się szuka.
Pozatym znasz takie powiedzienie: "szewc bez butów chodzi" ? ;)

kolo

2009-03-01 14:37:19

Znam, znam. Bo właśnie chciałem zbudować szukajeczkę, która przeszuka z bazy MySql. Sam jestem szewcem, tylko nie wiem jak zrobić z podziałem na kategorię :)

Spawnm

2009-06-03 09:00:52

skoro piszesz jak zrobić szukajke , to warto by było powiedzieć coś o LIKE , jest czasem stosowane.

nospor

2009-06-03 20:15:29

@Spawnm ale to nie jest istotą tego artykułu. Tutaj chodziło o pokazanie jak włożyć własne warunki w zależności od tego co poda użytkownik. A to czy ktoś użyje like, =, not in czy czego tam innego to już nie ta bajka ;)

Chris

2009-11-18 18:53:21

Super! Tego właśnie potrzebowałem.


Dodaj komentarz

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