Webcity.pl


  Open Power Template ...

  Wywiad z Wembzz /Inv...

  [tutorial] Realistyc...

  Własny mechanizm ses...

  Galeria w PHP

 

 02.02.06 - [new] E-video - artykuł

 30.01.06 - [update] Artykuł o sesjach

 18.12.05 - [update] PDO - artykuł

 19.08.05 - [new+upd] Aktualizacja materia...

 26.04.05 - [update] Nowy artykuł



  Pomocy WML
[php]Sesje nie działają, ...
[actionscript 2.0] [flash...
Problem z talicami w php
[ocena] llll.pl darmowe a...
Kamera na stronie interne...
Kamera na stronie interne...
[xml] Jak wyciągnąć dane
Wizualizacja w JS - POMOC
Web Developer - stała / f...

... i wiele innych wątków na forum ›

Partnerzy
› allRSS.info - katalog zasobów RSS
› iloveflyer.org - webdesign
› webserv.pl - serverpack
› skryptoteka.pl - mnóstwo skryptów
› vel.pl - hosting
› TelePraca.net - pracuj swobodnie
› PHP Solutions - magazyn PHP
› HELION - wydawnictwo informatyczne

Ksišżka dnia

CityMag
Wpisz swój e-mail, aby zaprenumerować nasz Magazyn, który zawiera najnowsze informacje ze świata i najciekawsze teksty.
 

Szukasz czegoś?
Nasza wyszukiwarka znajdzie wszystko, czego szukasz.
 

Szukanie zawansowane


  Reklama
  Redakcja
  Hosting
  Kanał

© WebCity.pl Team
 
 
  Forum Forum
Kursy Kursy
Porady Porady
Recenzje Recenzje
Newsy Newsy
Katalog stron WWW Katalog
Skrypty PHP Skrypty
Download Oferty i praca
Artykuły:
 Teoria
 Praktyka
 Promocja
 Inne
 

 Webcity.pl |

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:

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:

  • 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