Kurs MySQL w PHP, część 2 poprawiona

Czego się nauczysz w tej części kursu

W tej części kursu nauczysz się budować bardziej rozbudowane warunki w swoich zapytaniach oraz sortować wyniki zapytań. Na koniec pokażę jak radzić sobie z błędami powstałymi w wyniku wykonania zapytania.

Rozszerzanie zapytania - wyszukiwanie rekordów

Podczas poprzedniej lekcji nauczyłeś się wydawać proste zapytania do bazy danych, spróbujmy poznać nowe operatory i rozszerzyć nasze zapytania.
Przypomnijmy sobie podstawowe użycie polecenia SELECT:

SELECT nazwa_pola FROM nazwa_tabeli WHERE warunek

Jeśli rozszerzymy warunek o operator LIKE uzyskamy prostą wyszukiwarkę. Wzór zastosowania operatora like:

SELECT nazwa_pola FROM nazwa_tabeli WHERE nazwa_pola LIKE "wzór_dopasowania"

W praktyce wybrane zostaną wszystkie wiersze z tabeli, w których pole nazwa_pola pasuje do wzór_dopasowania. No tak - to nam za dużo nie mówi na początku. Spójrzmy na przykład praktyczny bardziej:

SELECT `id`, `nazwisko` FROM `nba` WHERE `nazwisko` LIKE "%pip%"

Wedle zadanego wzoru wybrane zostaną wszystkie wiersze z tabeli, w których nazwisko zawiera ciąg znaków "pip". Znak procenta (%) w języku SQL oznacza dowolną ilość (również zero!) dowolnych znaków. Jeśli chcielibyśmy wybrać wszystkie nazwiska zaczynające się na "pip" nasze zapytanie wyglądałoby następująco:

SELECT `id`, `nazwisko` FROM `nba` WHERE `nazwisko` LIKE "pip%"

Również możemy wybrać wszystkie nazwiska kończące się na "pip":

SELECT `id`, `nazwisko` FROM `nba` WHERE `nazwisko` LIKE "pip%"

Lub zaczynające się na literę "p" a kończące literą "n":

SELECT `id`, `nazwisko` FROM `nba` WHERE `nazwisko` LIKE "p%n"

W ten sposób możemy zbudować np. prostą wyszukiwarkę na stronie. Bardziej rozbudowaną wyszukiwarkę można zbudować za pomocą wyrażeń regularnych ale to temat o osobny artykuł.

Rozszerzanie zapytania - operatory porównań

Gdy porównujemy wartości określamy, że wartość danego pola musi być np. mniejsza niż jakaś tam wartość etc. Do opisania takich warunków musimy użyć operatorów porównań:

= operator równości

< i > operatory mniejszy od oraz większy od

<= i >= operatory mniejszy lub równy oraz większy lub równy

<> zaprzeczenie operatora =, sprawdza czy dwa elementy nie są identyczne

Rozszerzanie zapytania - operatory logiczne

Jak na razie nasze zapytania opierały się na pojedynczym warunku. Co jednak zrobić w przypadku gdy chcemy dokładniej określić zakres działania naszego zapytania i jeden warunek jest niewystarczający? W tym momencie przychodzą nam z pomocą operatory, oto kilka z nich:

AND - operator logiczny łączący warunki, przykład działania:

SELECT `id`, `nazwisko` FROM `nba` WHERE `punkty` > 100 AND `mistrzostwa` > 50

W powyższym przykładzie wybrane zostaną wszystkie rekordy, w których wartość pola punkty będzie większa od 100 i wartość pola mistrzostwa będzie większa od 50 - obydwa warunki muszą być spełnione.

OR - operator logiczny "lub" wymagający spełnienia przynajmniej jednego z warunków. Przykład:

SELECT `id`, `nazwisko` FROM `nba` WHERE `punkty` >= 100 OR `mistrzostwa` >= 50

Wybrane zostaną tylko te rekordy, w których wartość pola punky jest większa lub równa 100 lub wartość pola mistrzostwa jest większa lub równa 50 - jeden z dwóch warunków musi być spełniony.

IN - operator sprawdzający przynależność elementu do zadanego zbioru. Elementy zbioru podaje się w nawiasach okrągłych i wymienia po przecinkach. Przykład:

SELECT `id`, `nazwisko` FROM `nba` WHERE `id` IN (1,2,3)

Wybrane zostaną wszystkie rekordy, których pole id będzie równie 1, 2 lub 3. Czyli faktycznie wybrane zostaną trzy rekordy o z polami id o wartościach podanych w nawiasach okrągłych. W przypadku gdy mamy do czynienia ze zbiorem ciągłym lepiej będzie wykorzystać operator:

BETWEEN - operator sprawdzający przynależność elementu do danego przedziału. Przykład:

SELECT `id`, `nazwisko` FROM `nba` WHERE `id` BETWEEN 1 AND 5

Wybrane zostaną wszystkie rekordy, których pole id będzie z przedziału 1 do 5.

NOT - operator zaprzeczenia. Możemy go łączyć z innymi operatorami np "NOT BETWEEN" czy "NOT IN". Przykład:

SELECT `id`, `nazwisko` FROM `nba` WHERE `id` NOT BETWEEN 1 AND 5

Wybrane zostaną wszystkie rekordy, których pole id będzie z poza przedziału 1 do 5.

Łą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 i w tych mistrzostwach zdobyli już co najmniej 20 punków. Konstrukcja taka wyglądałaby następująco:

SELECT `id`, `nazwisko` FROM `nba` WHERE `lata` BETWEEN 10 AND 15 AND `punkty` > 20

Rozszerzanie zapytania - sortowanie wyników

Gdy wybieramy jakieś dane z tabeli ważna sprawą jest sposób prezentacji danych. Wszystkie wydobyte za pomocą języka zapytań SQL możemy posortować w dowolny sposób. Do sortowanie służy klauzula ORDER BY. Wzór stosowania:

SELECT nazwa_pola FROM nazwa_tabeli ORDER BY nazwa_pola [rodzaj_sortowania]

Rodzaj sortowania nie jest obowiązkowy. Dostępne są dwa rodzaje sortowania:

ASC - sortowanie rosnąco, domyślny sposób sortowania

DESC - sortowanie malejąco

Przykład zastosowania:

SELECT `id`, `nazwisko` FROM `nba` ORDER BY `punkty` DESC

Powyższy przykład wyświetli wszystkie wiersze tabeli nba posortowane według pola punky od największej wartość do najmniejszej. Możemy również sortować po kilku polach, np:

SELECT `id`, `nazwisko` FROM `nba` ORDER BY `punkty`, `nazwisko` DESC

Przykład ten posortuje najpierw według ilości punktów. Gdy trafimy na dwa rekordy, w których wartości pola punkty będą identyczne kolejnym kryterium będzie pole nazwisko. Ten przykład nie jest zbyt życiowy ponieważ kto sortuje nazwiska malejąco? ;) Możemy również mieszać sposoby sortowania np.:

SELECT `id`, `nazwisko` FROM `nba` ORDER BY `punkty` DESC, `nazwisko` ASC

W tym przykładzie posortujemy najpierw malejąco według ilości punktów, następnie gdy wystąpią dwa rekordy, w których ilość punktów będzie taka sama zostaną one wyświetlone w kolejności rosnącej według nazwiska.

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')
   or die('Nie mogę połączyć się z bazą danych: '.mysql_error());

mysql_select_db('nazwa_bazy')
   or die('Nie mogę wybrać bazy: '.mysql_error());

if (!$zaptanie=@mysql_query("tresc zapytania")) /* Sprawdza czy wykonanie powiodło się */
   echo 'Bład zapytania MySQL, odpowiedź serwera: '.mysql_error(); /* Drukuje błąd na stronie */
else /* Jeśli błąd nie wystąpił kontynuuje działanie programu */
{
   /* dalsze dzialanie skryptu */
}

Informacje o autorze

Piotr Kuźmiński, rok 2001, poprawiono: grudzień 2005
http://www.programista.biz
Znalazłeś błąd w tym kursie? Poinformuj mnie o tym.