Niewątpliwie obsługa baz danych w PHP jest jednym z największych dobrodziejstw, jednak z czasem staje się dość uciążliwa.
W tym artykule pokaże jak napisać cos w rodzaju sterownika do obsługi bazy danych MySQL. Jaka będzie różnica miedzy nim a standardowa obsługą bazy? Przede wszystkim prostota, nie trzeba będzie pamiętać nazw zmiennych i co najważniejsze dla każdej z baz danych obsługiwanej przez php można napisać taka sama klasę, dzięki czemu nie trzeba będzie pamiętać nazw funkcji do obsługi konkretnej bazy danych. Co do prędkości to korzystanie z takiej klasy nie spowalnia wykonywania skryptu, wiec chyba warto poświęcić chwile czasu na napisanie jej.
Pisanie zaczniemy od zdefiniowania potrzebnych nam zmiennych, na pewno przyda się zmienna $connection będzie odpowiedzialna za połączenie z baza danych, $database określa nazwę naszej bazy danych, będziemy też potrzebować pytania, czyli $query, skoro mamy pytanie to przyda się również odpowiedź, a raczej rezultat $result oraz $records tu będą przetrzymywane rekordy, do tego dodamy jeszcze dwie zmienne $queries: ilość zadanych pytań do bazy danych, oraz $lastId będzie przechowywać wartość ostatnio użytego pola o właściwości auto_increment. Teraz zobaczmy jak wygląda nasza klasa.
class sqlObject { var $connection; var $database; var $query; var $result = array(); var $records = array(); var $queries = 0; var $lastId; } |
Nie ma tego za dużo, ale zaraz dopiszemy odpowiednie metody, zacznijmy od funkcji error(), która będzie przechwytywać i pokazywać na ekranie błędy MySQL, przyda się to podczas debugowania aplikacji.
function error() { echo '<b>’.mysql_errno().'</b> : ’.mysql_error().'<br>n’; } |
Metoda nie przyjmuje żadnych argumentów jej jedynym zadaniem jest pobrać numer i tekst ostatniego błędu za pomocą funkcji mysql_errorno() i mysql_error(), oraz wyświetlenie tego na ekranie.
Teraz zajmijmy się połączeniem z baza posłuży nam do tego metoda connect(), zobaczmy źródło
function connect($host, $user, $password, $database, $persistent=FALSE) { $this->connection = ($persistent==TRUE) ? mysql_pconnect($host, $user, $password) : mysql_connect($host, $user, $password); if($this->connection && $database != „”) { $this->database = mysql_select_db($database, $this->connection); if($this->database) { return TRUE; } else { $this->error(); mysql_close($this->connection); return FALSE; } } else { $this->error(); return FALSE; } } |
Za pomocą operatora trój argumentowego sprawdzamy, jakie połączenie należy wykonać, stale czy zwykle jest to oczywiście uzależnione od wartości $persistent. Jeżeli udało się nam połączyć to wybieramy bazę danych w przeciwny wypadku wywołujemy wcześniej zdefiniowaną metodę, $this->error() która pokaże nam wszystkie informacje o uzyskanym błędzie, podobnie w przypadku gdy PHP nie może wybrać bazy danych, tylko że zamykamy też wcześniej utworzone połączenie.
Kolejną potrzebną funkcja jest close(), czyli jak nie trudno się domyślić zamykanie połączenia z baza danych.
function close() { if($this->connection) { if($this->result) mysql_free_result($this->result); mysql_close($this->connection); unset($this->query); unset($this->result); unset($this->database); unset($this->connection); return TRUE; } else $this->error(); } |
Oprócz zamykania połączenia i zwalniania rezultatu zapytania nasza funkcja zwalnia również wszystkie zasoby, których używaliśmy, służy do tego funkcja unset();
Teraz przejdźmy do najważniejszej metody, czyli query() jest ona odpowiedzialna za wysłanie pytania i odebranie wyniku, zobaczmy kod.
function query($query) { if($query!=”” && $this->database) { $this->query = $query; if($this->result) mysql_free_result($this->result); if($this->result = mysql_query($this->query, $this->connection)) { $this->lastId = mysql_insert_id(); $this->queries++; return $this->result; } else { $this->error(); } } else $this->error(); } |
Zasada działania funkcji jest prosta, najpierw przypisujemy $this->query wartość $query, jeżeli do zmiennej $this->result jest już przypisana jakiś wynik zapytania to zwalniamy go, następnie wysyłamy zapytanie mysql_query() jeśli wszystko jest w porządku to zwiększamy ilość zadanych pytań o jeden, pobieramy wartość ostatniego id (przydaje się podczas dodawania nowych rekordów do bazy), i zwracamy rezultat (return $this->result) w przypadku jakiegokolwiek błędu wywołujemy $this->error() i wyświetlamy błąd, służą do tego dwie ostatnie instrukcje else które wyłapują wszystkie błędy.
Możemy już łączyć się z bazą, wysyłać zapytania oraz przechwytywać błędy, pora aby nasza klasa „nauczyła” się odbierać wyniki zapytania, posłużą nam do tego dwie metody, fetchArray() i fetchRow(), na początek zajmiemy się pierwszą z nich.
function fetchArray($resultHandle=0) { $this->result = ($resultHandle==0) ? $this->result : $resultHandle; if($this->database && $this->result) { $this->records = mysql_fetch_array($this->result, MYSQL_ASSOC); if(is_array($this->records)) return $this->records; else $this->error(); } else $this->error(); } |
Jak to działa? Funkcja pobiera jeden argument jest on opcjonalny przyda się jedynie w przypadku zapętlonych pytań do bazy, na samym początku sprawdzamy czy jest on ustawion i przypisujemy zmiennej $this->>result odpowiednią wartość. Kolejnym krokiem jest sprawdzenie czy zdefiniowane są zmienne $this->database i $this->result, jeśli tak to za pomocą funkcji mysql_fetch_array() przypisujemy wynik do zmiennej $this->records, teraz zostaje jeszcze tylko sprawdzić czy $this->records jest tablicą jeśli tak to zwracamy wynik, w przeciwnym wypadku funkcja zwraca stosowny błąd.
Pora na drugą funkcje do odbioru danych, w zasadzie niczym się ona nie różni od poprzedniej więc nie będę opisywał zasady jej działania, pokaże tylko jak wygląda jej źródło.
function fetchRow($resultHandle=0) { $this->result = ($resultHandle==0) ? $this->result : $resultHandle; if($this->database) { $this->records = mysql_fetch_row($this->result, MYSQL_ASSOC); if($this->records) return $this->records; else $this->error(); } else $this->error(); } |
Zwróć jedynie uwagę na to, że zamiast mysql_fetch_array() użyłem mysql_fetch_row().
Ostatnią metodą która będzie nam potrzebna do rozpoczęcia pracy z własną klasą jest numRows(), wiadomo, że często zachodzi potrzeba sprawdzenia ile rekordów uzyskano w wyniku zapytania, nasza funkcja wygląda tak:
function numRows() { if($numRows = mysql_num_rows($this->result)) return $numRows; else $this->error(); } |
W zasadzie nie ma co tu opisywać, za pomocą instrukcji if sprawdzamy czy $numRows jest poprawnym wynikiem działania funkcji mysql_num_rows() jeśli tak to zwracamy $numRows w przeciwnym razie wrzucamy błąd i kończymy działanie funkcji.
Nasza klasa jest już gotowa do pracy na koniec pokaże jak z niej korzystać.
//tworzymy nowy obiekt $sql = new sqlObject; //laczymy sie z baza $sql->connect(’localhost’, 'root’, 'password’, 'baza’); //zadajemy pytanie $sql->query(„SELECT * FROM tabela”); //wyswietlamy wyniki //sprawdzamy ilosc wierszy //wprowadzamy nowy wpis //zamykamy polaczenie z baza danych |
Jak widać korzystanie z tej klasy jest bardzo wygodne, w ogóle nie trzeba pamiętać o przekazywaniu odpowiednich identyfikatorów co znacznie ułatwia pracę programiście.
Oczywiście można dopisać jeszcze kilka lub kilkanaście metod do tej klasy, albo w ogóle napisać ją od nowa tak aby była bardziej rozbudowana zawierała cachowanie wyników zapytań, obsługę transakcji, ja tylko pokazałem Ci jak teraz sam musisz się zastanowić czego będziesz wymagał od swojego obiektu.