JustPaste.it

Obsługa MySQL'a w PHP

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.

Łączenie się z bazą danych

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.

Wysyłanie zapytań do bazy i raportowanie błędów

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ż:

  • Dla zapytań SELECT, EXPLAIN, DESCRIBE, SHOW zwracany jest identyfikator zbioru wyników umożliwiający pobranie danych poprzez odpowiednie funkcje.
  • Dla pozostałych zapytań zwraca TRUE lub FALSE w zależności od tego, czy zadziałały, czy nie.
  • Jeśli zrobimy błąd składni w zapytaniu, funkcja zwróci FALSE (nawet w przypadku zapytań SELECT).

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.

Pobieranie wyników

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.

O wynikach jeszcze słów kilka

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"?

Dodawanie, usuwanie, poprawianie

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ą.

Zakończenie

Mam nadzieję, że artykuł ten przyzwoicie wyjaśnił Ci, jak komunikować się z bazą MySQL poprzez PHP. Pamiętaj jednak: nie poprzestawaj na tym. MySQL, oraz biblioteki do komunikacji z nim są tak potężnymi narzędziami, że nawet ja po dwóch latach korzystania z nich wciąż odkrywam ich nowe możliwości :). A to jest klucz do sukcesu i do tego, by twoje skrypty stały się profesjonalne.

Autor: Tomasz "Zyx" Jędrzejewski, www.zyxist.com

 

Źródło: http://webcity.pl/webcity/obsluga_mysql_a_w_php

Licencja: Creative Commons - użycie niekomercyjne - bez utworów zależnych