Architektura internetowej bazy danych Internetowa aplikacja bazodanowa opiera się na klasycznej architekturze internetowej bazy danych, przedstawionej na rysunku. Przeglądarka 1 2 3 Serwer Interpreter 6 WWW 5 4 Serwer MySQL Typowa transakcja bazodanowa przeprowadzana w Internecie składa się z następujących etapów: 1. Przeglądarka internetowa uŝytkownika wysyła Ŝądanie udostępnienia określonej strony WWW, wykorzystując odpowiedni formularz HTML. Natomiast strona z wynikami moŝe się nazywać rezultaty.php. 2. Serwer WWW przyjmuje Ŝądanie wyświetlenia strony rezultaty.php, odnajduje właściwy plik i przekazuje go do interpretera PHP. 3. Interpreter PHP rozpoczyna przetwarzanie skryptu. Wewnątrz skryptu zawarte jest polecenie połączenia z bazą danych i wykonania zapytania.
Z kolei następuje otwarcie połączenia z serwerem MySQL i przesłanie zapytania. 4. Serwer MySQL przyjmuje zapytanie i je przetwarza, po czym rezultat odsyła do interpretera PHP. 5. Interpreter kończy wykonywanie skryptu, który zazwyczaj formatuje otrzymane wyniki zgodnie ze standardem HTML, po czym przesyła wynikowy kod HTML do serwera WWW. 6. Serwer WWW przesyła wreszcie kod HTML do przeglądarki. Proces ten przebiega zawsze tak samo, bez względu na typ interpretera PHP, czy uŝywanego serwera bazy danych. Najczęściej serwer WWW, interpreter PHP i serwer bazy danych MySQL pracują na tym samym komputerze. Jednak metodę rozdzielenia serwera bazodanowego na oddzielną maszynę stosuje się do celów bezpieczeństwa lub zmniejszenia obciąŝenia systemu, co moŝe wpłynąć na efektywną wydajność całego systemu.
Polecenia PHP do obsługi bazy danych MySQL int mysql_affected_rows([int id_polaczenia]) - funkcja zwraca liczbę wierszy (rekordów) objętych poprzednio wykonaną operacją na bazie danych; funkcja odnosi się do operacji INSERT, UPDATE oraz DELETE, lecz nie dotyczy ona SELECT; w przypadku SELECT patrz funkcja mysql_num_rows(); w przypadku wykonania kwerendy usuwającej DELETE bez klauzuli WHERE, czyli usunięcie wszystkich rekordów, funkcja zwróci wartość 0, w przeciwnych wypadkach zostanie zwrócona wartość dodatnia; int mysql_change_user(string uzytkownik, string haslo [, string baza [, int id_polaczenia]]) - funkcja zmienia bieŝącego uŝytkownika dla bieŝącego połączenia lub połączenia określonego poprzez identyfikator połączenia id_polaczenia na uŝytkownika o nazwie uzytkownik oraz haśle haslo; jeśli zmiana się nie powiedzie aktywny zostaje uŝytkownik dotychczasowy;
int mysql_close([int id_polaczenia]) - funkcja zamyka połączenie z bieŝącą bazą danych lub bazą o identyfikatorze połączenia id_polaczenia; zwrócona wartość false świadczy o wystąpionym błędzie podczas zamykania połączenia; połączenie jest takŝe zamykane (jeśli oczywiście wcześniej nie zostało to zrobione) w momencie zakończenia wykonywania skryptu; int mysql_connect([string nazwa_hosta[:port]] [, string uzytkownik] [, string haslo]) - funkcja nawiązująca połączenie z serwerem bazy danych MySQL; w przypadku wystąpienia błędu funkcja zwraca łańcuch zawierający opis błędu; aby ukryć błąd moŝna przed nazwą funkcji dodać znak @; int mysql_create_db(string nazwa_bazy [, int id_polaczenia]) - funkcja tworząca bazę MySQL o nazwie nazwa_bazy dla połączenia o identyfikatorze id_polaczenia; istnieje jej takŝe inna (wcześniejsza) wersja, tj. mysql_createdb();
int mysql_data_seek(int id_wynikow, int numer_wiersza) - funkcja przesuwa wewnętrzny wskaźnik wyników do pozycji określonej przez numer_wiersza; w przypadku wystąpienia błędu zwrócona zostanie wratość false; int mysql_db_query(string nazwa_bazy, string zapytanie [, int id_polaczenia]) - funkcja wykonuje zapytanie na bazie danych i zwraca wynik zapytania lub w przypadku błędu wartość false; int mysql_drop_db(string nazwa_bazy [, int id_polaczenia]) - funkcja usuwa bazę o nazwie nazwa_bazy; w przypadku błędu zwracana jest wartość false; istnieje jej takŝe inna (wcześniejsza) wersja, tj. mysql_dropdb(); int mysql_errno([int id_polaczenia]) - funkcja zwraca numer błędu wynikłego podczas wykonywania poprzedniej operacji na bazie danych;
string mysql_error([int id_polaczenia]) - funkcja zwraca opis błędu (komunikat) wynikłego podczas wykonywania poprzedniej operacji na bazie danych; array mysql_fetch_array(int id_wynikow [, int typ_wyniku]) - funkcja zwraca wiersz (rekord) ze zbioru wyników w postaci tablicy asocjacyjnej lub wartość false, jeśli nie ma więcej wierszy (rekordów); funkcja jest rozszerzeniem funkcji mysql_fetch_row(); typ_wyniku moŝe przyjąc wartości MYSQL_ASSOC, MYSQL_NUM lub MYSQL_BOTH; object mysql_fetch_field(int id_wynikow [, int offset_pola]) - funkcja zwraca informacje o wskazanej kolumnie zbioru wyników w postaci obiektu; obiekt posiada następujące właściwości: name - nazwa kolumny table - nazwa tabeli do której naleŝy kolumna max_length - maksymalna długość kolumny
not_null - wartość 1 jeśli kolumna nie moŝe posiadać wartości NULL primary_key - wartość 1 jeśli kolumna jest kluczem podstawowym unique_key - wartość 1 jeśli kolumna jest kluczem unikalnym multiple_key - wartość 1 jeśli kolumna nie jest kluczem unikalnym numeric - wartość 1 jeśli kolumna zawiera wartości numeryczne blob - wartość 1 jeśli kolumna jest typu BLOB type - typ kolumny unsigned - wartość 1 jeśli kolumna zawiera wartości tylko dodatnie (bez znaku) zerofill - wartość 1 jeśli kolumna jest wypełniana wartościami zerowymi array mysql_fetch_lengths(int id_wynikow) - funkcja zwraca tablice zawierającą maksymalną długość danych, jakie moŝna zapisać w kaŝdej kolumnie wskazanego zbioru wyników o identyfikatorze id_wynikow; odnosi się do wiersza ostatnio zwróconego przez funkcje: mysql_fetch_row(), mysql_fetch_array() oraz mysql_fetch_object()
object mysql_fetch_object(int id_wynikow [, int typ_wyniku]) - funkcja zwraca obiekt zawierający wartości poszczególnych pól z wyniku zapytania przechowywanym pod identyfikatorem id_wynikow; dostęp do pola odbywa się następująco: $dane = mysql_fetch_object($wynik); echo ($dane->nazwa_pola); array mysql_fetch_row(int id_wynikow) - funkcja zwraca tablicę zawierającą wartości poszczególnych pól z wyniku zapytania przechowywanym pod identyfikatorem id_wynikow; dostęp do poszczególnych pól odbywa się poprzez podanie numeru pola, np.: $dane = mysql_fetch_row($wynik); echo ($dane[0]); string mysql_field_flags(int id_wynikow, int offset_pola) - funkcja zwraca flagi związane ze wskazanym polem offset_pola zbioru wyników o identyfikatorze;
id_wynikow w postaci łańcucha znakowego; są to pojedyncze słowa oddzielone pojedynczą spacją; int mysql_field_len(int id_wynikow, int offset_pola) - funkcja zwraca długość pola offset_pola; string mysql_field_name(int id_wynikow, int indeks_pola) - funkcja zwraca nazwę pola o numerze indeks_pola; int mysql_field_seek(int id_wynikow, int offset_pola) - funkcja przesuwa wskaźnik na pole o numerze offset_pola; string mysql_field_table(int id_wynikow, int offset_pola) - funkcja zwraca nazwę tabeli, w której znajduje się pole o numerze offset_pola;
string mysql_field_type(int id_wynikow, int offset_pola) - funkcja zwraca typ pola o numerze offset_pola; są to na przykład wartości: int, real, string, blob, itd.; int mysql_free_result(int id_wynikow) - funkcja zwalnia pamięć przeznaczoną na przechowywanie wyniku o identyfikatorze id_wyniku; funkcja jest takŝe wywoływana w momencie zakończenia wykonywania się skryptu, jeśli oczywiście nie była wywołana wcześniej; int mysql_insert_id([int id_polaczenia]) - funkcja zwraca ID wygenerowane dla pola AUTO_INCREMENT podczas poprzednio wykonanej operacji INSERT na bazie; int mysql_list_dbs([int id_polaczenia]) - funkcja zwraca listę baz danych dostępnych na serwerze MySQL;
int mysql_list_fields(string nazwa_bazy, string nazwa_tabeli [, int id_polaczenia]) - funkcja zwraca listę pól dostępnych w tabeli nazwa_tabeli w bazie o nazwie nazwa_bazy dla bieŝącego połączenia lub połączenia o identyfikatorze id_polaczenia; w przypadku wystąpienia błędu zwracana jest wartość -1; int mysql_list_tables(string nazwa_bazy [, int id_polaczenia]) - funkcja zwraca listę tabel znajdujących się w bazie nazwa_bazy; int mysql_num_fields(int id_wynikow) - funkcja zwraca wartość liczbową określającą ilość pól w wyniku o identyfikatorze id_wynikow; int mysql_num_rows(int id_wynikow) - funkcja zwraca wartość liczbową określającą ilość wierszy (rekordów) w wyniku o identyfikatorze id_wyniku;
int mysql_pconnect([string host[:port][:/sciezka/do/socketu]] [, string uzytkownik] [, string haslo]) - funkcja nawiązująca trwałe połączenie (niezamykane w czasie zakończenia wykonywania skryptu) z serwerem bazy danych MySQL; w przypadku wystąpienia błędu funkcja zwraca łańcuch zawierający opis błędu; aby ukryć błąd moŝna przed nazwą funkcji umieścić znak @; int mysql_query(string zapytanie [, int id_polaczenia]) - funkcja wysyła i wykonuje zapytanie SQL zapytanie na bazie danych; zapytanie nie powinno być zakończone średnikiem; w przypadku wystąpienia błędu (niemoŝliwości wykonania zapytania przez serwer MySQL) zwracana jest wartość false; int mysql_result(int id_wynikow, int wiersz [, mixed pole]) - funkcja zwraca wartość określonego pola pole w wierszu o numerze wiersz w zbiorze wyników o identyfikatorze id_wynikow; pole moŝe określać numer pola, jego nazwę lub przyjąć postać nazwa_tabeli.nazwa_pola;
int mysql_select_db(string nazwa_bazy [, int id_polaczenia]) - funkcja określa aktywną (domyślną) bazę danych; string mysql_tablename(int id_wynikow, int indeks) - funkcja zwraca nazwę tabeli, zwróconej przez funkcję mysql_list_tables() w postaci zbioru wyników w identyfikatorze id_wynikow, o ineksie (pozycji) indeks;
Przykład uŝycia powyŝszych funkcji /* nawiązanie połaczenia z bazą MySQL na komputerze o nazwie nazwa_hosta, dostęp do bazy jako uŝytkownik o nazwie user oraz haśle password */ $conn = mysql_connect("nazwa_hosta", "user", "password") or die("połączenie nie moŝe zostać nawiązane"); /* określenie nazwy bazy jako nazwa_bazy */ mysql_select_db("nazwa_bazy"); $sql_query = "SELECT * FROM tabela"; /* wykonanie zapytania zapisanego w zmiennej $sql_query i zapisane wyniku w $wynik */ $wynik = mysql_query($sql_query) or die("błędne zapytanie"); /* pętla pobierająca kolejno wiersze przechowywane w wyniku $wynik */ while ($row = mysql_fetch_array($wynik)) { /* pokazanie pola o nazwie nazwa_pola */ echo ($row["nazwa_pola"]."\n"); } /* zwolnienie pamięci zajmowanej na przechowanie rekordów */ mysql_free_result($wynik); /* zamknięcie połączenia z bazą danych */ mysql_close($conn);
Zapytania Aby wykonać cokolwiek w swojej bazie naleŝy wysłać do niej informacje, które wysyłane są do bazy danych w postaci zapytań (query). SłuŜy do tego funkcja mysql_query(zapytanie). Wszystkie zapytania wysyła sie w następujący sposób: $zaptanie="twoje zapytanie"; $wykonaj=mysql_query($zapytanie); Po takiej operacji zmienna $wykonaj będzie zawierać wartość TRUE, jeśli operacja powiedzie się, jeśli nie - zwróci wartość FALSE. Łączymy się z bazą danych Aby połączyć się z bazą danych uŝywamy komendy: mysql_connect (nazwa_hosta[:port] [, uŝytkownik] [,hasło]); W praktyce oznacza to, Ŝe wymagana jest nazwa hosta - następnie opcjonalnie moŝemy wpisać nazwę uŝytkownika oraz jego hasło. Jeśli nie podamy nazwy hosta automatycznie nastąpi próba połączenia się z localhostem. Jeśli zabraknie nazwy uŝytkownika automatycznie zostaniemy zalogowani jako właściciel procesu baz danych, przewaŝnie właściciel nie ma
ustawionego hasła, więc trzeci parametr nie jest wymagany. PoniŜszy przykład pokazuje jak połączyć się z serwerem mojserwer.pl jako uŝytkownik foo, z hasłem off: $sql = mysql_connect (mojserwer.pl, foo, off); Funkcja mysql_connect zwróci wartość TRUE, jeśli zakończy się sukcesem, jeśli nie powiedzie się - zwróci wartość FALSE. Jeśli zakończy się juŝ operacje w bazie naleŝy się z nią rozłączyć, co dokonuje się funkcją mysql_close(id_połączenia). Aby zakończyć połączenie, które zaprezentowane powyŝej, naleŝałoby zastosować komendę 'mysql_close' w następujący sposób: mysql_close($sql); Tworzenie nowej bazy oraz jej wybieranie Do stworzenia nowej bazy uŝywamy komendy mysql_create_db(nazwa) np.: mysql_create_db("zawodnicy"); Samo stworzenie bazy nie oznacza, Ŝe właśnie na niej będziemy wykonywać operacje, dlatego musimy ją wybrać, co robimy komendą mysql_select_db(nazwa) np.:
mysql_select_db("zawodnicy"); Od tej pory moŝna juŝ wykonywać róŝne operacje w bazie 'zawodnicy'. Zagadnienia SQL Bazę danych moŝemy stworzyć takŝe za pomocą wyraŝeń SQL w formie zapytania: $zapytanie="create DATABASE zawodnicy"; $wykonaj = mysql_query($zaptanie); Gdy baza zostanie juŝ utworzona moŝna zacząć wprowadzać do niej dane. Najpierw jednak trzeba utworzyć tabelę, robimy to wg następującego schematu składni SQL: CREATE TABLE nazwa_tabeli (nazwa1 typ1, nazwa2 typ2, PRIMARY KEY(nazwa_x)) Oto utworzenie tabeli według podanego schematu: $zapytanie = "CREATE TABLE nba (id char(3) NOT NULL, imie char(30), lata char(3), punkty char(3), mistrzostwa char(3), PRIMARY KEY(id))"; Rozpatrując powyŝszy przykład: klucz oznaczony jako PRIMARY KEY oznacza, Ŝe klucz ten jest kluczem głównym, a klucz główny nie moŝe się powtarzać - w
przypadku, gdyby klucz główny się powtórzył po prostu rekord nie zostanie dodany do tabeli, klucz oznaczony jako NOT NULL nie moŝe być pusty. Po utworzeniu tabeli, moŝna do niej dodać dane wg następującego schematu: INSERT INTO nazwa_tabeli VALUES (wartosc_pola1, wartosc_pola2, wartosc_pola3...) Nie zawsze trzeba wypełniać wszystkich pól, a dokonuje się tego w następujący sposób: INSERT INTO nazwa_tabeli (nazwa_pola1, nazwa_pola2) VALUES (wartosc_pola1, wartosc_pola2) Oto przykład dodania do tabeli nowego zawodnika, operacja ta wygląda tak: $zapytanie = "INSERT INTO nba VALUES(Jordan, 13, 32, 6)"; Po wykonaniu takiej operacji tabela 'nba' będzie juŝ zawierać jeden rekord. Teraz kolejno moŝna dodawać w ten sam sposób kolejne rekordy. Jeśli chcemy przeszukać naszą tabelę w poszukiwaniu jakiegoś konkretnego rekordu, robimy to za pomocą komendy SELECT wg schematu: SELECT nazwa_pola FROM nazwa_tabeli WHERE warunek
Oczywiście nazw pól moŝemy podać kilka, lub wszystkie - jednak zamiast tego po prostu wstawiamy znak gwiazdki (SELECT * FROM itd.), warunek moŝe być bardzo złoŝony. ZałóŜmy, Ŝe chcemy przeszukać naszą tabelę w poszukiwaniu zawodnika o nazwisku 'Pipen', dokonujemy tego w następujący sposób: $zapytanie = "SELECT imie FROM nba WHERE imie='pipen'"; Funkcja zwróci wartość TRUE jeśli znajdzie w naszej tabeli Pipena, jeśli nie - FALSE. NaleŜy pamiętaj jednak, Ŝe rozróŝniane są wielkie i małe litery, dlatego 'Pipen' to nie to samo, co 'pipen' czy 'PIPEN'... Jeśli jakiś rekord jest juŝ nieaktualny, lub po prostu źle wpisaliśmy dane, naleŝałoby go zaktualizować, do czego słuŝy komenda UPDATE: UPDATE nazwa_tabeli SET wartosc_pola WHERE warunek Aby zmienić w tabeli liczbę lat gry Jordana, naleŝy to zrobić tak: $zapytanie = "UPDATE nba SET lata=15 WHERE imie='jordan'"; Teraz Jordan grał juŝ 15, a nie tak jak wcześniej 13 lat. Jeśli jakieś dane z danej tabeli juŝ nas nie interesują pozbywamy się ich komendą DELETE:
DELETE FROM nazwa_tabeli [WHERE warunek] W powyŝszym przykładzie warunek wzięto w nawias, poniewaŝ jeśli nie zostanie podany warunek z tabeli, wówczas wszystkie rekordy zostaną wymazane. W praktyce kasowanie prezentuje się następująco: $zapytanie = "DELETE FROM nba WHERE imie=jordan"; Od tej chwili Jordana juŝ nie ma w tabeli zawodników nba. Jak wyświetlić wyniki przeszukiwania tabeli? Wyświetlanie wyników przeszukiwania tabeli odbywa się wg poniŝszego schematu: $zapytanie = "SELECT * FROM nazwa_tabeli"; $wykonaj = mysql_query($zaptanie); while($wiersz = mysql_fetch_array($wykonaj)) { print "Pole pierwsze".$wiersz['pole1']."<br>"; print "Pole drugie".$wiersz['pole2']."<br>"; print "Pole trzecie".$wiersz['pole3']."<br>"; } Wszystko to odbywa się dzięki komendzie 'mysql_fetch_array', której zadaniem jest pobieranie
wierszy ze zbioru wyników i zwracanie jej w postaci tablicy. Prosta wyszukiwarka Okazuje się, Ŝe wyszukiwarka jest niczym innym, jak uŝyciem operatora SELECT w połączeniu z operatorem LIKE. Tradycyjne uŝycie SELECT wygląda następująco: SELECT nazwy_pol FROM nazwa_tabeli WHERE warunek Jeśli w warunku zostanie zastosowany 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. 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łoby procent tylko na początku (%nik), wówczas pasowałyby wyraz '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 tabeli z zawodnikami NBA, moŝna 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ŝna wyszukać 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%\""; Rozszerzenie wyszukiwarki 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 instrukcja wyglądałaby następująco: WHERE nazwa_pola BETWEEN 4 AND 259 Łącząc powyŝsze operatory moŝna np. wyszukać wszystkich zawodników z 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ŝna 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. Dla przykładu moŝna wyświetlić wszystkich zawodników z 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ć? 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 ] }
Zamiast zatrzymywać działanie programu, moŝna po prostu w przypadku mniej powaŝnego błędu wyświetlać odpowiednią informację i dalej kontynuować program. Zliczanie pól w zbiorze wyników Komenda 'mysql_num_rows' słuŝy do zwracania ilości pól znajdujących się we wskazanym zbiorze wyników, stosujemy ją według następującego schematu: $zapytanie = "SELECT nazwy_pol FROM nazwa_tabeli WHERE warunek"; $wykonaj = mysql_query($zaptanie); $znaleziono = mysql_num_rows($wykonaj); Po wykonaniu tej operacji zmienna '$znaleziono' będzie zawierać liczbę wyszukiwanych elementów. Teraz moŝnawyświetlić: ile razy znaleziono poszukiwane wyraŝenie, a potem znalezione elementy. Przykład: $zapytanie = "SELECT * FROM nba WHERE imie LIKE \"%a%\" ORDER BY DESC"; $wykonaj = mysql_query($zaptanie); $znaleziono = mysql_num_rows($wykonaj); if ($znaleziono == "0") { print "Nie znaleziono Ŝadnego zawodnika z literą 'a' w imieniu"; } else
{ print "Znaleziono $znaleziono zawodników z literą 'a' w imieniu.<br><br>"; } while ($row = mysql_fetch_array($dzialaj)) { print "Imie zwodnika: <b>".$row['imie']." </b><br>lata gry: <b>".$row['imie']." </b>"; } Kasowanie baz danych Czasami zdarzy się tak, Ŝe zrezygnujemy nie tylko z kilku informacji zawartych w danej bazie, ale z całej bazy, wtedy kasujemy ją przy uŝyciu komendy mysql_drop_db. Dokonuje się tego w następujący sposób: mysql_drop_db (nazwa_bazy) W odniesieniu do naszego przykładu, skasowanie całej bazy danych z zawodnikami wyglądałoby tak: mysql_drob_db ("zawodnicy"); Informacje o tabeli W przypadku dostępu do tabeli, której nie jesteśmy twórcami, moŝna uzyskać o niej pewne informacje np. nazwy kolumn czy jaka jest maksymalna długość znaków w danym polu. Nazwy pól moŝemy wydobyć za pomocą komendy 'mysql_field_name' wg schematu:
mysql_field_name(id_wyników, indeks_pola) Rozpatrzmy to na przykładzie: $zapytanie = "SELECT * FROM nba"; $dzialaj=mysql_query($zapytanie); $n_pola = mysql_field_name($dzialaj, 0); Po wykonaniu tej operacji zmienna $n_pola będzie zawierać nazwę pierwszego pola (indeks 0) w tym przypadku zmienna zwróci wartość 'id' (takie jest pierwsze pole w tabeli nba). Maksymalną liczbę znaków danego pola wyciągamy komendą 'mysql_field_len' według następującego schematu: mysql_field_len(id_wyników, indeks_pola) Przykład: $zapytanie = "SELECT * FROM nba"; $dzialaj=mysql_query($zapytanie); $d_pola = mysql_field_len($dzialaj, 0); Zmienna '$d_pola' będzie zawierać liczbę '10', poniewaŝ pierwsze pole 'id' ograniczyliśmy długością 10 znaków. Nazwę tabeli, z której pochodzi wskazane pole moŝemy uzyskać korzystając z komendę 'mysql_field_table' w następujący sposób:
mysql_field_table(id_wyników, indeks_pola) Przykład: $zapytanie = "SELECT * FROM nba"; $dzialaj=mysql_query($zapytanie); $n_tabeli = mysql_field_table($dzialaj, 0); Zmienna '$n_tabeli' zwróci 'nba' czyli nazwę tabeli, z której pochodzi pole o indeksie zerowym. Aby dowiedzieć się, jakiego typu jest dane pole, trzeba uŝyć komendy 'mysql_field_type' analogicznie, jak poprzednie komendy tego typu: mysql_field_type(id_wyników, indeks_pola) Wykład zrealizowany w oparciu o literaturę: Luke Welling, Laura Thomson PHP i MySQL. Tworzenie stron WWW. Vademecum profesjonalisty. Wydawnictwo HELION 2003 http://krzychu.webmarketing.pl/ http://php.webhelp.pl/kursy/mysql/pliki/