|
|
Webcity.pl | Artykuły
Sterownik MySQL
Autor: sickboy
|
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 funcji 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:
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:
Metody MySQL
Metody statystyk
Metody funkcyjne sterownika
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];
}
} |
Metoda _error() odpowiedzialna jest za wyświetlenie komunikatu o błędzie. Znajduje się w niej podział na cztery główne błędy MySQL:
Przy łączeniu się z serwerm baz
Przy wybieraniu bazy danych
Przy wykonywaniu danego zapytania
Przy zamykaniu sesji 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().
Przykłady zastosowań sterownika
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:
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 $arrayznajdują się kolejne elementy danego rekordu.
2. Pobranie ilości wierszy w danym zbiorze wyników:
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
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:
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
Oczywiście korzystając ze strerownika nie odrzucamy w kąt ogromnych możliwości PHP. Dalej możemy korzystać z naszych ulubionych funkcji do generowania zapytań, czy do zmiany kodowania danego tekstu. Oto przykład:
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(); |
Podsumowanie
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. |
Powrót |
|
|