<?php /****************************************** *Autor: daniel1302 *Data Utworzenia: 26.08.2009 * *Klasa ma za zadanie nawiązać połączenie *z bazą danych, wykonywać na niej różnego *rodzaju operacje, ujednolicać strukturę. *Jest to głowna(klasa matka) klasa dla *warstwy biurowej. Aplikacja kożysta z *zwykłych funkcji bazy danych. ******************************************/ Abstract Class Model { /** *Definicja dostępnych opcji **/ protected $select = 1, $update = 1, $delete = 1, $add = 1; protected $allFields; /**************************************** *Metoda magiczna pozwoli na odczytanie *wartości z bazy danych. * *$var- Pole do odczytania ****************************************/ public function __get($var) { return $this->allFields[$this -> structure[$var]]; else return $var; } /**************************************** *Nawiązywanie połączenia z bazą danych ****************************************/ public function __construct() { } /**************************************** *Funkcja zamienia pola z uniwersalnych na *te z bazy danych. * *$parms - Parametry do przetwozenia ****************************************/ public function prepareExpression($parms) { return preg_replace_callback('/#{1}([a-z0-9_\-]+)/i', array($this, 'prepareExpression_callback'), $parms); } private function prepareExpression_callback($matches) { return $this->structure[$matches[1]]; } /**************************************** *Funkcja posłuży do logowania błędów ****************************************/ protected function error() { } /**************************************** *Funkcja odpowiada za pobranie pólz bazy *danych. * *$fields- Pola do pobrania *$parms- Parametry warunku ****************************************/ public function select($fields = null, $parms = null) { //Sprawdz dostęp if ($this -> select == 0) return false; //Utwórz warunek $parms = $this -> prepareExpression($parms); //Wybierz pola do wybrania z bazy //Właściwe zapytanie $result = mysql_fetch_assoc(mysql_query('SELECT '.$fields.' FROM '.$this -> table.' WHERE '.$parms)) or $this-> error(); return $result; } /**************************************** *Funkcja odpowiada za edytowanie pól * *$fields- Pola do pobrania *$parms- Warunek dodania ****************************************/ { if ($this -> update == 0) return false; //Podlicz ilość pól do uaaktualnienia i zweryfikuj z warunkami return false; for($i=0; $i<$fieldsCount; $i++) { //Pzekonwertuj nazwy pól z jednolitych na rzeczywiste $_field = $this -> prepareExpression($fields[$i]); //Utwórz wyrażenie warunkowe $_parms = $this -> prepareExpression($parms[$i]); } } /**************************************** *Funkcja usuwająca rekordy z bazy danych * *$parms- Warunek usunięcia ****************************************/ public function delete($parms) { if ($this->delete == 0) return false; //Przygotuj warunek po WHERE $parms = $this -> prepareExpression($parms); //Właściwe zapytanie } /**************************************** *Funkcja dodająca rekordy z bazy danych * *$fields- Pola *$value- Wartości pól ****************************************/ public function add($fields, $value) { if ($this -> add == 0) return false; //Właściwe zapytanie mysql_query('INSERT INTO '.$this -> table.'('.$this -> prepareExpression($fields).') VALUES ('.$value.')')or $this->error(); } } /****************************************** *Autor: daniel1302 *Data Utworzenia: 26.08.2009 * *Jedynym zadaniem klasy jest nawiązanie *połączenie z bazą danych ******************************************/ Class Mysql_Connect { /** *Instancja **/ /** *Konstruktor nawiąże połączenie **/ public function __construct($host, $user, $pass, $db_name) { return $_db; } /** *Impletacja Singletunu- Zapobiegnie wielokrotnej próbie nawiązania połączenia przy wielu modelach **/ { else return self::$instance; } }
Przykładowy model
Class Player_Model extends Model { //Nazwa Tabeli protected $table = 'players'; //Struktura public $structure; public function __construct() { parent::__construct(); //Ujednolicamy dane. 'id' => 'player_id', 'name' => 'player_name', 'gold' => 'player_gold' ); //Tworzymy gracza $this -> add('#id, #name', '1, \'Tyranus\''); //Ustalamy zmienną allFields dla __get() $this -> allFields = $this -> select('*', '#id=1'); //Odczytujemy z zmiennej $this -> allFields funkcją __get() //Dodajemy graczowi 100 złota a drugiemu zmieniamy mu nick //Usuwamy gracza $this -> delete('#id=1'); } }
Jeśli w bazie zmienimy nazwe tabeli to zmieniamy $this->table, jeśli nazwę pola to zmieniamy $this->structure. W zapytaniach podajemy klucz z $this -> structure poprzedzony #(hash).
Proszę o ocene oraz komentarze i propozycje zmian.