Prosty sterownik MySQL w PHP

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.



Wstęp

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.

Do góry

Omówienie 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().

Do góry

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:

<?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();
 
?>

Do góry

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.

Do góry

Waszym zdaniem:

Nikt jeszcze nie dodał swojego komentarza. Możesz być pierwszy!


Twoim zdaniem:

Reklama

banner

Partnerzy

CityDesign.pl
phpSolutions