Autor: Tomasz Jędrzejewski
Data publikacji: 02.03.2004, 17:48 | Ostatnia modyfikacja: 05.11.2006, 20:37
Artykuł ten dokładnie opisuje rozszerzenie języka skryptowego PHP umożliwiające komunikowanie się z bazą danych MySQL.
Z nieznanych mi przyczyn do czasu publikacji tego artykułu na Webcity nie było ani jednego tekstu opisującego komunikowanie się z MySQL'em poprzez PHP. Owocowało to czasem dosyć kuriozalnymi (dla mnie) pytaniami na forum. Postanowiłem więc wyciągnąć rękę do ludzi i napisać ten oto tekst...
MySQL jest darmowym i bardzo dobrym serwerem baz danych, z którym można komunikować się za pomocą języka SQL (Structured Query Language). Jego kurs znajdziesz w serwisie. Należy zwrócić uwagę, iż wersja tegoż języka dla MySQL'a nie ma jeszcze zaimplementowanych wielu zaawansowanych elementów takich jak funkcje, triggery, widoki, kursory, podzapytania (dopiero od MySQL 4.1), a więc jeśli będziesz potrzebować skomplikowanych rozwiązań, by zarządzać informacjami, przyjrzyj się konkurencji: PostgreSQL, Oracle itd.
Aby umożliwić twórcom innych programów komunikację z serwerem MySQL'a, jego autorzy stworzyli specjalną bibliotekę zwaną libmysql, która zawiera cały zestaw niezbędnych funkcji wykonujących tak zwaną czarną robotę za programistę. Moduł PHP php_mysql korzysta właśnie z tej biblioteki (do niedawna zawierał też własną implementację, którą jednak musiał usunąć z powodu zmiany licencji MySQL'a), co gwarantuje nam, iż korzystanie z niego będzie do złudzenia przypominało używanie libmysql w normalnych programach.
Po krótkim wprowadzeniu i omówieniu bazy danych, przejdźmy do rzeczy następnej, czyli instalacji modułu. Jest ona banalnie prosta - w systemie Windows cała rzecz sprowadza się do edycji pliku php.ini i usunięcia średnika z linii:
;extension=php_mysql.dll
Pod Linuxem sprawa jest troszkę trudniejsza, bowiem należy od nowa skompilować PHP z dyrektywą:
--with-mysql=sciezka_do_libmysql
UWAGA: W starszych wersjach PHP (< 4.3.2) nie musisz robić NIC, byś mógł korzystać z MySQL'a.
Jak zapewne wiesz z rozmaitych kursów MySQL'a, aby połączyć się z bazą danych, należy posiadać: adres serwera, oraz dane użytkownika, poprzez którego chcemy zalogować się do serwera (nazwa i hasło). Domyślnie przy pracy w domu wystarczą parametry: localhost, root, [puste], natomiast w przypadku serwerów on-line admin powinien podać odpowiednie parametry z momentem utworzenia konta WWW. Do łączenia się i rozłączania służą funkcje
mysql_connect('localhost', 'root', '');
oraz
mysql_close();
Wypadałoby teraz wspomnieć o pewnej właściwości tychże funkcji, co odbije się w liczbie parametrów podawanych do pozostałych funkcji modułu. Przyjrzyj się takiemu kodowi:
<?php mysql_connect('localhost', 'root', ''); ... mysql_close(); ?>
Utworzyliśmy tutaj jedno połączenie z bazą i domyślnie wszystkie pozostałe funkcje będą pracowały właśnie na nim. Ale jest sytuacja, gdy będą nam potrzebne dwa połączenia - i co wtedy? Wtedy korzystamy z tego, iż mysql_connect() może zwrócić ich identyfikatory jako zmienne:
<?php $polaczenie1 = mysql_connect('localhost', 'root', ''); $polaczenie2 = mysql_connect('localhost', 'kalasanty', '314159265358979'); ... mysql_close($polaczenie1); mysql_close($polaczenie2); ?>
Samo połączenie się z serwerem nie oznacza, iż od razu możemy wysyłać do niego zapytania - w końcu nie wybraliśmy jeszcze bazy, na jakiej będziemy operować. Tu przychodzi nam z pomocą funkcja mysql_select_db(), której używa się w następujący sposób:
<?php mysql_connect('localhost', 'root', ''); mysql_select_db('moja_kurde_baza'); ... mysql_close(); ?>
Jeśli posiadamy większą ilość połączeń, jako pierwszy parametr możemy podać zmienną identyfikującą dane połączenie: mysql_select_db('mojakurdebaza', $polaczenie1); - taka zasada obowiązuje w prawie wszystkich funkcjach. Jeśli podajemy identyfikator połączenia, zawsze znajdzie się on jako parametr ostatni.
Skoro umiemy się z bazą połączyć, przydałaby się nam umiejętność wysyłania do niej poleceń. Użyjemy w tym celu funkcji mysql_query():
<?php mysql_connect('localhost', 'root', ''); mysql_select_db('mojakurdebaza'); $result = mysql_query('SELECT * FROM klienci'); mysql_close(); ?>
Funkcja ta wysyła do bazy pojedyncze zapytanie, zwracając jego wynik. Na ten element powinieneś zwracać największą uwagę, ponieważ:
Dlatego też najlepiej używać tej funkcji w takim połączeniu:
$result = mysql_query('twoje zapytanie') or die('Błąd w zapytaniu takim a takim. Komunikat: '.mysql_error().'; Numer błędu: '.mysql_errno());
Kod ten spowoduje, że w przypadku zwrócenia wartości FALSE wyświetli się komunikat błędu - raczej małe jest prawdopodobieństwo wyrzucenia FALSE bez żadnej przyczyny. Pozwoli to od razu podjąć odpowiednie czynności zaradcze, od razu wskazując nam miejsce błędu jako wadliwe zapytanie.
Bez możliwości pobrania danych z bazy, samo ich istnienie nie miałoby sensu. Dlatego PHP ma zaimplementowanych kilka funkcji służących do tego celu. Najważniejszą rzeczą, którą musisz o nich wiedzieć, jest to, że pojedyncze wywołanie takiej funkcji pobiera tylko jeden rekord, zatem proces pobierania musi odbywać się w pętli. Wygląda to mniej więcej tak:
<?php mysql_connect('localhost', 'root', ''); mysql_select_db('mojakurdebaza'); $result = mysql_query('SELECT * FROM klienci'); while($row = mysql_fetch_row($result)){ print_r($row); echo '<br>'; } mysql_close(); ?>
mysql_fetch_row() zwraca tablicę, w której każdy element reprezentuje jedno pole w bazie. Indeksy każdego z pól są wartością numeryczną, zatem pierwsze pole wyniku otrzyma numer 0, drugie 1, trzecie 2 itd. Możesz to zresztą zobaczyć po wykonaniu przykładowego kodu (i posiadaniu odpowiedniej tabeli z danymi).
Oprócz mysql_fetch_row() istnieją też inne funkcje różniące się właśnie sposobem indeksowania elementów tablicy. I tak: mysql_fetch_array() - występują zarówno indeksy numeryczne, jak i tekstowe, zatem do pola można odwołać się albo przez $row[1], albo $row['nazwapola']. mysql_fetch_assoc() zwraca tablicę wyłącznie z indeksami tekstowymi ($row['nazwapola']). Istnieje jeszcze mysql_fetch_object(), która (jak sama nazwa wskazuje), zwraca obiekt: $row -> nazwapola.
Tutaj chciałbym nadmienić pewną rzecz... funkcje omówione w tej, oraz w następnej sekcji nie wymagają identyfikatora połączenia z bazą danych! Zatem konstrukcja w stylu mysql_fetch_array($zbior_wynikow, $polaczenie_z_baza) nie może mieć w żadnym wypadku miejsca. Pamiętaj o tym.
Istnieją jeszcze dwie operacje na wynikach, które warto omówić. Na początek - sprawdzamy, ile rekordów zwróciło zapytanie:
<?php mysql_connect('localhost', 'root', ''); mysql_select_db('mojakurdebaza'); $result = mysql_query('SELECT * FROM klienci'); echo 'Zapytanie zwróciło '.mysql_num_rows($result).' wyników'; mysql_close(); ?>
Czyli jedna funkcja z przekazanym identyfikatorem wyniku załatwia nasz problem.
Teraz sprawa bardziej techniczna - wiadomo, że każdemu wynikowi musi być przydzielona jakaś pamięć. PHP zwalnia pamięć wszystkich naszych wyników przy zrywaniu połączenia z bazą. Lecz jeśli piszemy skrypt, który bardzo obciąża bazę i w dodatku wykonuje się bardzo długo, powinniśmy pomyśleć, by pamięć tę zwolnić samodzielnie po pobraniu interesujących nas danych. Tu z pomocą wkracza mysql_free_result():
<?php mysql_connect('localhost', 'root', ''); mysql_select_db('mojakurdebaza'); $result = mysql_query('SELECT * FROM klienci, oponenci, absolwenci, walnieci'); // tutaj bardzo zlozona operacja przetwarzania wynikow mysql_free_result($result); // tutaj jeszcze 10 takich operacji mysql_close(); ?>
W większości zastosowań naprawdę nie trzeba jej używać, ale warto o niej wiedzieć, bo "a nuż się przyda"?
Czasem zachodzi potrzeba pobrania ID rekordu, który chwilę wcześniej wstawiliśmy zapytaniem INSERT. To także możemy wykonać, używając odpowiedniej funkcji, a mianowicie mysql_insert_id():
<?php
mysql_connect('localhost', 'root', '');
mysql_select_db('mojakurdebaza');
mysql_query('INSERT INTO produkty (nazwa, cena) VALUES('Drzwi do wanny', '9.60')');
echo 'Produkt ten otrzymał ID '.mysql_insert_id().'<br/>';
mysql_close();
?>
To jednak nie wszystko. Załóżmy, że na gwałt potrzebujesz danych o tym, ile rekordów zostało usuniętych/zmienionych przez zapytanie DELETE, bądź UPDATE. To tez możesz załatwić jedną funkcją - mysql_affected_rows():
<?php mysql_connect('localhost', 'root', ''); mysql_select_db('mojakurdebaza'); mysql_query('DELETE FROM produkty WHERE cena > 30.99'); echo 'Skasowano '.mysql_affected_rows().' produktów.<br/>'; mysql_close(); ?>
Pragnę tylko zwrócić uwagę, że zarówno mysql_insert_id(), jak i mysql_affected_rows() mogą żądać identyfikatora połączenia z bazą.
Autor: Tomasz "Zyx" Jędrzejewski, www.zyxist.com
Waszym zdaniem:
Nikt jeszcze nie dodał swojego komentarza. Możesz być pierwszy!