"select * from tabela "
Spacja na końcu jest jak dla mnie odrobinę drażniąca. Drugą sprawą są dobre nawyki (nie chodzi tylko o ten przykład).
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:
<?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.
<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".
<?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.
<?php
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ż spacja zniknęła. Taka spacja nie ma żadnego znaczenia, a jak tobie przeszkadza to naprawdę mogłeś sobie zmienić w 3 sekundy jak ja teraz