Autor: Bartosz Maciaszek
Data publikacji: 13.12.2002, 23:29 | Ostatnia modyfikacja: 15.09.2006, 12:50
Artykuł ten ma na celu przedstawić kod prostego sterownika do bazy danych MySQL, ktory w założeniu ma uprościć i uprzyjemnić programowanie w PHP z użyciem tych baz danych. Sterownik ułatwia komunikację programisty z serwerem MySQL i pozwala zapomnieć o funkcjach z rodziny mysql_* i niewygodnym pilnowaniu poprawności kodu.
Każdy z Was miaÅ‚ styczność z bazami danych. Jeżeli chodzi o mnie, korzystanie z dobrodziejstw MySQL sprawiaÅ‚o mi niesamowitÄ… radość i nieraz pomagaÅ‚o rozwiÄ…zać wiele problemów z PHP. WedÅ‚ug mnie baza danych jest najlepszym (czyt. najbezpieczniejszym i najÅ‚atwiejszym) sposobem przechowywania różnorakich danych. Korzystanie z niej jest ciekawe, ale czy nie znudziÅ‚o Ci siÄ™ czasem ciÄ…gÅ‚e wklepywanie tych samych dÅ‚ugich nazw funkcji do obsÅ‚ugi bazy? Nie masz dosyć pilnowania poprawnoÅ›ci zmiennych przechowujÄ…cych dane z MySQL? Naprzeciw temu napisaÅ‚em ciekawÄ… klasÄ™ do prostej obsÅ‚ugi bazy danych. Korzystanie z niej jest Å‚atwe, przyjemne i intuicyjne, a przy okazji czytania tego artykuÅ‚u i analizowania zamieszczonego w nim kodu możesz Å‚atwo nauczyć siÄ™ opracowywania ciekawych rozwiÄ…zaÅ„ w PHP. No wiÄ™c co? Zabierzmy siÄ™ za omawianie kodu.
Na poczÄ…tku musimy zadeklarować nazwÄ™ klasy. W tym przykÅ‚adzie zastosowaÅ‚em nazwÄ™ db. Nazwa ta jednak jest dowolna i nie wpÅ‚ywa bardzo na sposób korzystania w klasy. Zalecam jednak zastosowanie takiego samego nazewnictwa, jak w przykÅ‚adach:
<?php class db {
Po zainicjowaniu klasy musimy okreÅ›lić pola, z których nasza klasa bÄ™dzie korzystać:
var $connect_id; var $db_name; var $query_result; var $executed_queries = 0; var $timer = 0;
Pierwsza zmienna ($connect_id) będzie przechowywać id połączenia z serwerem baz danych. Część metod w naszej klasie będzie korzystać z tej wartości. W drugiej zmiennej przechowywane bedzie ID rezultatu zapytania do bazy danych. Dzięki zastosowaniu takiego pola nie będzie konieczne podawanie tej wartości w argumentach wywołania metod bazujących na wbudowanych w PHP funkcjach do obsługi MySQL. Kolejnym polem w naszej klasie jest zmienna $executed_queries. Będzie ona przechowywać ilość wykonanych przez naszą klasę zapytań do bazy. W ostatnim polu ($timer) przechowywany będzie czas wykonania wszystkich zapytań do bazy.
Ok, po dÅ‚uższym wstÄ™pie zajmijmy siÄ™ czymÅ› ciekawszym, a mianowicie konstruktorem naszej klasy (metodÄ…, która wykona siÄ™ automatycznie po zainicjowaniu klasy). Ta metoda musi mieć nazwÄ™ takÄ… samÄ…, jak nazwa naszej klasy, czyli db:
function db($db_host, $db_user, $db_pass, $db_name, $p = false) { if($p == false) { $this -> connect_id = @mysql_connect($db_host, $db_user, $db_pass); } else { $this -> connect_id = @mysql_pconnect($db_host, $db_user, $db_pass); } if($this -> connect_id) { $dbselect = @mysql_select_db($db_name, $this -> connect_id); if(!$dbselect) { $this -> _error('dbselect'); mysql_close($this -> connect_id); return false; } else { $this -> dbname = $db_name; return true; } } else { $this -> _error('connect'); return false; } }
Powyższa część kodu, jak już wspomniaÅ‚em, spróbuje połączyć siÄ™ z serwerem baz danych i wybrać zdefiniowanÄ… przez naz bazÄ™ danych. Jak nietrudno siÄ™ domyÅ›lić jako argumenty tej metody podajemy odpowiednio adres serwera baz danych, nazwÄ™ użytkownika, hasÅ‚o, nazwÄ™ naszej bazy danych i wartość logiczna (true lub false), która 'powie' skryptowi, czy ma siÄ™ połączyć z serwerem baz danych na staÅ‚e, czy tylko na czas wykonywania danego sktyptu.
ResztÄ™ metod z których korzysta nasza klasa podzieliÅ‚em na 3 części:
Dwie pierwsze grupy metod przechowujÄ… tak zwane metody publiczne, a trzecia - metody niepubliczne, inaczej funkcyjne naszego sterownika.
Na poczÄ…tku zajmijmy siÄ™ omawianiem pierwszej grupy metod. W tej grupie znajdÄ… siÄ™ wszystkie potrzebne funkcje bazujÄ…ce na wbudowanych w PHP funkcjach do obsÅ‚ugi MySQL-a. PierwszÄ… omówionÄ… przeze mnie metodÄ… bedzie funkcja query(). Oto ona:
function query($query) { $this -> query_result = ''; $start = $this -> _get_time(); $this -> query_result = @mysql_db_query($this -> dbname, $query, $this -> connect_id); if(!$this -> query_result) { $this -> _error('query'); return false; } else { $this -> executed_queries++; $this -> timer += $this -> _get_time() - $start; return true; } }
Metoda ta ma za zadanie wykonać okreÅ›lone w argumencie wywoÅ‚ania zapytanie do bazy danych i zmierzyć czas jego wykonywania. W przypadku nieprawidÅ‚owej skÅ‚adni lub innego błędu rozpoznanego podczas wykonywania, funkcja ma zrwócić stosowny komunikat. Metoda ta odwoÅ‚uje siÄ™ do dwu funkcyjnych metod naszej klasy (_get_time() i _error()). DziaÅ‚anie i skÅ‚adnia tych funkcji jest opisana niżej.
Metody ukazane na listingu poniżej mają za zadanie spełniać podobne funkcje, jak ich odpowiedniki w PHP. Oto te funkcje. Przeanalizuj je.
function fetch_row($query_result = '') { $query_result = (empty($query_result)) ? $this -> query_result : $query_result; $array = mysql_fetch_array($query_result); if(!$array) { return false; } else { return $array; } } function num_rows($query_result = '') { $query_result = (empty($query_result)) ? $this -> query_result : $query_result; $numrows = mysql_num_rows($query_result); if(!$numrows) { return false; } else { return $numrows; } } function affected_rows() { return mysql_affected_rows($this -> connect_id); } function insert_id() { return mysql_insert_id($this -> connect_id); } function free_result($query_result = '') { $query_result = (empty($query_result)) ? $this -> query_result : $query_result; mysql_free_result($query_result); }
Oto krótki opis tych metod:
fetch_row()
DziaÅ‚a podobnie jak funkcja mysql_fetch_array(). Tworzy 'podwójnÄ…' tablicÄ™, której indeksami siÄ™ zarówno nazwy kolumn w danej tabeli MySQL, jak i kolejne liczby zaczynajÄ…ce siÄ™ od 0. (funkcja mysql_fetch_row() tworzy tablicÄ™ tylko z indeksami numerycznymi. Dużym udogodnieniem funkcji fetch_row() jest fakt, że nie musimy podawać w argumencie ID rezultatu zapytania do serwera baz danych. Gdy nie podamy tego argumentu, ID rezultatu pobierane jest z pola $query_result.
num_rows()
Zwraca ilość rekordów w zbiorze wyników zapytania do bazy danych. Podobnie jak w poprzedniej funkcji, nie musimy podawać ID rezultatu jako argumentu, co uÅ‚atwia pracÄ™.
affected_rows()
Bezargumentowa metoda zwracajÄ…ca ilość zmienionych pól podczas wykonania danego zapytania. Do standardowej funkcji mysql_afected_rows() dodawane jest jako argument ID połączenia z serwerem baz danych, które przechowywane jest w polu $connect_id.
insert_id()
Zwraca kolejne wolne ID rekordu. Wartość ta może być wykorzystana do zapisu kolejnego rekordu do bazy.
free_result()
Podobnie jak funkcja mysql_free_result() usuwa zbiór wyników z pamiÄ™ci podrÄ™cznej. W przypadku niepodania ID rezultatu jako argumentu, wykorzystywane jest to, które jest zapisane w polu $query_result.
KolejnÄ… ważnÄ… funkcja jest metoda, która pozwoli na bezpieczne zamkniÄ™cie sesji MySQL. Oto ta funkcja:
function close() { $db_close = @mysql_close($this -> connect_id); if(!$db_close) { $this -> _error('dbclose'); return false; } else { return true; } }
Metoda ta, podobnie jak poprzednie, jest bezargumentowa. Po jej wywołaniu zamykane jest bieżace połączenie z serwerm baz danych. W przypadku niepowodzenia zwracany jest stosowny komunikat.
Zajmijmy siÄ™ teraz drugÄ… grupÄ… funkcji naszego sterownika, a mianowicie funkcjami statystycznymi. Oto one:
function get_query_cnt() { return $this -> executed_queries; } function get_execution_time() { return round($this -> timer, 5); }
MyÅ›lÄ™, żę skÅ‚adnia tych funkcji jest na tyle prosta, że nikt nie bÄ™dzie miaÅ‚ problemów z samodzielnym ich przeanalizowaniem.
Zajmijmy siÄ™ teraz omówieniem dwu ostatnich funkcji, o których mowa byÅ‚a już wczeÅ›niej, a mianowicie chodzi o metody _error() i _get_time(). Oto one:
function _error($type) { $text = '<h2>MySQL Error</h2>' . "\n"; switch($type) { case 'connect': $text .= 'Wystąpił błąd podczas łączenia się z serwerem baz danych'; break; case 'dbselect': $text .= 'Wystąpił błąd podczas wybierania bazy danych'; break; case 'query': $text .= 'Wystąpił błąd podczas wykonywania zapytania SQL'; break; case 'dbclose': $text .= 'Wystąpił błąd podczas zamykania sesji MySQL'; break; default: $text .= 'Ogólny błąd MySQL'; } $text .= '!<hr>MySQL said: <i>' . mysql_error() . '</i>'; die($text); } function _get_time() { $time = explode(' ', microtime()); return $time[0] + $time[1]; } } ?>
Jako że jest to ostatnia instrukcja w pliku, zamykamy klamrą definicję klasy db.
Metoda _error() odpowiedzialna jest za wyÅ›wietlenie komunikatu o błędzie. Znajduje siÄ™ w niej podziaÅ‚ na cztery gÅ‚ówne błędy MySQL:
W każdym z wyżej wymienionych przypadków nasz sterownik zwraca odpowiedni komunikat i użytkownik zostaje poinformowany o zaistniaÅ‚ym błędzie.
Funkcja _get_time() jest metodÄ…, która pomaga obliczać czas, w jakim zostaÅ‚y wykonane zapytania do bazy. Pobiera ona dokÅ‚adny czas rozpoczÄ™cia i zakoÅ„czenia wykonywania zapytania. RóżnicÄ™ tych czasów, zaokrÄ…glonÄ… do piÄ™ciu miejsc po przecinku zwraca metoda get_execution_time().
No tak, napisaÅ‚em trochÄ™ mÄ…droÅ›ci, opisaÅ‚em dokÅ‚adnie dziaÅ‚anie każdej metody sterownika, ale pewnie maÅ‚o kto wie jak z niego korzystać w praktyce. Poniżej znajduje siÄ™ kilka przykÅ‚adów zastosowaÅ„ tego skryptu.
1. Pobranie i zapisanie do tablicy konkretnego rekordu z bazy:
<?php include('lib_mysql.php'); // includowanie pliku z naszym sterownikiem $db = new db('localhost', 'root', 'tajne', 'moja_baza'); $db -> query("select * from tabela where id = 5"); $array = $db -> fetch_row(); ?>
W kolejnych komórkach tablicy $array znajdujÄ… siÄ™ kolejne elementy danego rekordu.
2. Pobranie iloÅ›ci wierszy w danym zbiorze wyników:
<?php include('lib_mysql.php'); // includowanie pliku z naszym sterownikiem $db = new db('localhost', 'root', 'tajne', 'moja_baza'); $db -> query("select * from tabela"); $ile = $db -> num_rows(); ?>
W zmiennej $ile mamy ilość wierszy w zbiorze wyników tego zapytania.
3. Pobranie i wyÅ›wietlenie grupy rekordów:
<?php include('lib_mysql.php'); // includowanie pliku z naszym sterownikiem $db = new db('localhost', 'root', 'tajne', 'moja_baza'); $db -> query("select * from tabela"); while($array = $db -> fetch_row()) { echo 'id: ' . $array['id'] . ', nazwa: ' . $array['nazwa']; } ?>
lub inny sposób:
<?php include('lib_mysql.php'); // includowanie pliku z naszym sterownikiem $db = new db('localhost', 'root', 'tajne', 'moja_baza'); $db -> query("select * from tabela"); $dane = array(); while($array = $db -> fetch_row()) { $dane[] = $array; } ?>
i teraz wszystkie wyniki zapytania mamy w jednej tablicy.
4. Korzystanie ze zmiennych i funkcji:
<?php include('lib_mysql.php'); // includowanie pliku z naszym sterownikiem $db = new db('localhost', 'root', 'tajne', 'moja_baza'); function zapytanie($tabela, $warunek) { $zapytanie = "select * from " . $tabela . " where " . $warunek; return $zapytanie; } $zapytanie = zapytanie('tabela', 'id = 2'); $db -> query($zapytanie); $array = $db -> fetch_row(); ?>
Jak widzicie, korzystanie z takiego dobrodziejstwa, jakim jest sterownik MySQL znacznie przyspiesza, a zarazem uÅ‚atwia pracÄ™, zarówno przy dużych, jak i przy mniejszych skryptach. Coż mogÄ™ powiedzieć na koniec. DziekujÄ™ za uwagÄ™ i majÄ…c nadziejÄ™, że takie rozwiÄ…zania przypadÅ‚y Wam do gustu, życzÄ™ miÅ‚ego korzystania ze sterownika.
Waszym zdaniem:
Nikt jeszcze nie dodał swojego komentarza. Możesz być pierwszy!