Witam, pisałem skrypty dla niejakiego Mariusza na tym forum znanego jako zlotownia. Ale po jego ostatnim zachowaniu postanawiam udostpnić skrypt do publicznego użytku i przy okazji do oceny.
<?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)
{
if (isset($this -> structure[$var]) && isset($this -> allFields)) 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)
{
}
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
$fields = (is_null($fields)) ?
'*' : $this -> prepareExpression($fields);
//Właściwe zapytanie
return $result;
}
/****************************************
*Funkcja odpowiada za edytowanie pól
*
*$fields- Pola do pobrania
*$parms- Warunek dodania
****************************************/
public function update
(Array $fields, Array $parms) {
if ($this -> update == 0)
return false;
//Podlicz ilość pól do uaaktualnienia i zweryfikuj z warunkami
$fieldsCount = count($fields); if ($fieldsCount != count($parms)) 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]);
mysql_query('UPDATE '.$this->table.' SET '.$_field.' WHERE '.$_parms)or
$this-> error(); }
}
/****************************************
*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
mysql_query('DELETE FROM '.$this -> table.' WHERE '.$parms)or
$this -> error(); }
/****************************************
*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
******************************************/
{
/**
*Instancja
**/
static private $instance = null;
/**
*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
**/
public static function getInstance
($host, $user, $pass, $db_name) {
self::$instance = new Mysql_Connect($host, $user, $pass, $db_name); 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.
$this -> structure = array( '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
$this -> update(array('#gold=#gold+100', '#name=\'Daniel1302\''), array('#id=1', '#id=2')); //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.