[ Podstawy MySQL'a (cz. 2) ]

Podczas poprzedniej lekcji dowiedzieliście się jak tworzyć bazy danych oraz jak w prosty sposób nimi zarządzać - teraz postaram się wam przedstawić bardziej zaawansowane struktury.

Budujemy prostą wyszukiwarkę

Na początku pierwszej lekcji wśród ogromnych zalet MySQL'a podałem m. in. łatwość jego obsługi - zawsze wydawało mi się, że wyszukiwarka jest strasznie trudną strukturą, żeby nie nazwać jej magiczną. Jak się okazuje wyszukiwarka jest niczym innym jak użyciem operatora SELECT (który poznałeś podczas poprzedniej lekcji) w połączeniu z operatorem LIKE. Tradycyjne użycie SELECT wygląda tak:

SELECT nazwy_pol FROM nazwa_tabeli WHERE warunek

Jeśli w warunku zastosujemy operator LIKE otrzymamy bardzo prostą wyszukiwarkę:

SELECT nazwy_pol FROM nazwa_tabeli WHERE nazwa_pola LIKE '%szukane_wyrażenie%'

Operator LIKE służy tutaj do przeszukiwania pól tekstowych w poszukiwaniu danego wyrażenia, znak procenta przed i po wyrażeniu odgrywa bardzo ważną rolę - powoduje dopasowanie dowolnych znaków przed i po danym wyrażeniu, spróbuję przedstawić to na przykładzie.

Poszukiwane wyrażenie 'nik' (zakładając, że znak procentu znajduje się przed i po wyrażeniu tj. %nik%):
Pasuje do niego np.: konik, nikt, nikogo, komornik, nikotyna. Jeśli nasze wyrażenie zawierało by procent tylko na początku (%nik) wtedy pasowałyby 'konik' i 'komornik' i inne wyrazy kończące się na 'nik', ponieważ dopasowywane są tylko wyrazy zaczynające się dowolną liczbą dowolnych znaków a kończących się na 'nik'. Natomiast wyrazy 'nikogo', 'nikt', 'nikotyna' nie pasowałyby, ponieważ 'nik' powinno być końcem wyrazu. Sytuację odwrotną uzyskamy, jeśli znak procentu postawimy na końcu wyrażenia.

Nawiązując do poprzedniej lekcji, podczas której stworzyliśmy tabelę z zawodnikami NBA, możemy np. przeszukać tabelę w poszukiwaniu wszystkich zawodników, w których imieniu i nazwisku występuje np. litera 'a'. Wyrażenie służące przeszukaniu takiemu wyglądałoby następująco:

$zapytanie = "SELECT * FROM nba WHERE imie LIKE \"%a%\"";

Równie dobrze możemy szukać wszystkich imion kończących się na 'a':

$zapytanie = "SELECT * FROM nba WHERE imie LIKE \"%a\"";

Lub zaczynających się literą 'a':

$zapytanie = "SELECT * FROM nba WHERE imie LIKE \"a%\"";

Taką samą wyszukiwarkę, a nawet dużo bardziej skomplikowaną i z większymi możliwościami można również napisać za pomocą wyrażeń regularnych SQL, jednak to jest temat na osobny artykuł.

Rozszerzamy wyszukiwarkę

Jak na razie nasze poszukiwania opierały się na wyszukiwaniu na tylko jednym warunku - jeśli jednak zechcemy wyszukać jakiejś danej, która zawiera więcej niż jeden warunek? W tym momencie z pomocą przychodzą nam dwa znane operatory z języka PHP 'AND' i 'OR' oraz dwa nowe 'BETWEEN' i 'IN'.

AND (można również &&) - jest to operator, dzięki, któremu można stworzyć złożone warunki, jego schemat wygląda następująco:

instrukcja WHERE warunek1 AND warunek2

Funkcja zwróci wartość TRUE, jeśli obydwa warunki zostaną spełnione, jeśli jeden z nich lub oba nie zostaną spełnione funkcja zwróci wartość FALSE.

OR (można również ||) - kolejny operator, dzięki, któremu można stworzyć złożone warunki, jego schemat wygląda następująco:

instrukcja WHERE warunek1 OR warunek2

Funkcja zwróci wartość TRUE, jeśli przynajmniej jeden z warunków zostanie spełniony, jeśli nie zostanie spełniony żaden warunek funkcja zwróci wartość FALSE.

IN - za pomocą tego operatora sprawdzamy czy dana wartość należy do określonego zbioru. Elementy zbioru podaje się w nawiasach i oddziela przecinkami. Schemat:

instrukcja WHERE nazwa_pola IN (1,2,5,8)

Funkcja zwróci wartość TRUE, jeśli wartość danego pola będzie należeć do określonego przez nas wcześniej zbioru - w tym przypadku, jeśli wartość będzie równa 1, 2, 3, lub 8. Jeśli chcemy np. sprawdzić czy wartość należy do jakiegoś przedziału to zamiast wypisywać cały zbiór przy użyciu operatora IN, możemy użyć operatora BETWEEN.

BETWEEN - sprawdza czy dana wartość należy do przedziału. Schemat:

instrukcja WHERE nazwa_pola BETWEEN dolny_przedział AND gorny_przedział

Jeśli chcielibyśmy teraz sprawdzić czy wartość pola należy do przedziału od 4 do 259 to nasza 'formułka' wyglądałaby następująco:

instrukcja WHERE nazwa_pola BETWEEN 4 AND 259

Łącząc powyższe operatory moglibyśmy np. wyszukać wszystkich zawodników z naszej tabeli, którzy grają co najmniej 10 do maksymalnie 15 lat, zbierają średnio co najmniej 20 punków na mecz i w swoim imieniu mają literę 'e'. Konstrukcja taka wyglądałaby następująco:

$zapytanie = "SELECT * FROM nba WHERE imie (LIKE \"e\") AND (lata BETWEEN 10 AND 15) AND (punkty > 20)";

Sortowanie wyników

Wyniki poszukiwań do tej pory były posortowane w takiej kolejności, w jakiej dodaliśmy je do bazy danych, ale jeśli zechcielibyśmy posortować naszych graczy np. w kolejności alfabetycznej lub wg ilości punktów, jakie zdobywają na mecz? Do takiej operacji potrzebna będzie nam komenda ORDER BY wraz z komendą DESC. Schemat stosowania tych komend przedstawia się następująco:

SELECT * FROM nazwa_tabeli ORDER BY nazwa_pola DESC

Oczywiście możemy sortować wg kilku pól, wtedy wymieniamy kolejne pola po przecinkach:

SELECT * FROM nazwa_tabeli ORDER BY nazwa_pola1 DESC, nazwa_pola2 DESC, nazwa_pola3 DESC...

Brak operatora DESC spowoduje wyświetlenie danych w kolejności odwrotnej do pożądanej. Przykładowo postaram się wam pokazać jak wyświetlić wszystkich zawodników z naszej tabeli w kolejności alfabetycznej, jeśli jednak znalazłoby się dwóch koszykarzy o identycznych personaliach kolejnym kryterium do ustawiania w kolejności będzie średnia ilość zdobywanych punków na mecz.

SELECT * FROM nba ORDER BY imie DESC, punkty DESC

Elegancka analiza błędów

Często nasz kod zawiera błędy, jednak jeśli nawet jakaś operacja się nie powiedzie my nie zostaniemy o tym poinformowani. Co zrobić aby uniknąć takich sytuacji lub chociaż odpowiednio je przeanalizować? Podczas pierwszej lekcji zwróciłem uwagę, że jeśli wykonanie zapytania, jakie wysłaliśmy do serwera nie powiedzie się funkcja mysql_query() zwróci wartość FALSE, w takim wypadku należałoby odpowiednio wykorzystać fakt, że o ty wiemy. Funkcja mysql_error() zawiera treść błędu baz danych MySQL, jeśli takowy istnieje. Teraz w połączeniu z elementarną instrukcją If otrzymujemy bardzo potężne narzędzie służące analizie błędów. Poniższy kawałek kodu przedstawia jak zatrzymywać program i wyświetlać komunikat błędu:

$sql = mysql_connect (mojserwer.pl, foo, off);
$zaptanie="twoje zapytanie";
if (!($wykonaj=mysql_query($zaptanie))) /* Sprawdza czy wykonanie powiodło się */
{
$error = mysql_error($sql) ; /* Kopiuje zawartość błędu do zmiennej $error */
echo "Bład skryptu, odpowiedź serwera: $error"; /* Drukuje błąd na stronie */
}
else /* Jeśli błąd nie wystąpił kontynuuje działanie programu */
{
[ dalsze dzialanie programu ]
}

Oczywiście nie wszystkie błędy są na tyle poważne, żeby od razu zatrzymywać działanie programu - można po prostu w przypadku mniej poważnego błędu wyświetlać odpowiednią informację i dalej kontynuować program.

 

Autor:
Piotr Kuźmiński
pk@php.pl / piotr.k@2com.pl
http://pk.help.pl
http://www.php.pl