[php5] classe base de données

Description

Cette source se base sur la classe mysql de FhX :
http://www.phpcs.com/code.aspx?ID=33135
Elle y ajoute quelques subtilités ;-)
- permet de se connecter à n'importe quel sgbd dont on a définit la classe (2 à l'heure actuelle, à titre d'exemple : mysql et mssql), avec 1 seul et même appel. En fait, on instancie notre objet en lui passant en paramètre le nom de base. Cela permet de réutiliser le projet quel que soit le sgbd installée, et ce à moindre coût.
- n'autorise qu'une seule et unique instance de l'objet db.
- utilisation de la fonction magique __autoload

Source / Exemple :


//fichier dbfactory.cls.php

<?php
abstract class dbfactory {

    private static $instance;                   // Instance courante de la classe
    
    protected $_config;                         // Paramètres de configuration base de donnée.
    protected $query;                           // Ressource de query
    
    public $history = array();                  // Historique des requêtes
    public $query_id = 0;                       // Compteur de requêtes.

    // Initialise les variables de connections et active la connection à la base de donnée.
    // Constructeur protégé permettant de n'avoir qu'une unique instance de la classe grâce à la méthode singleton
     protected function __construct ($host=NULL, $user=NULL, $passwd=NULL, $name=NULL) {
        if ( !is_array($this->default_cfg) ) {
         throw new Exception('Vous devez remplir les paramètres de la configuration par defaut de votre base de donnée');
        }

        foreach ($this->default_cfg as $key=>$val ) {
             $this->_config[$key] = (isset($$key) ) ? $$key : $val;
        }

        unset($this->default_cfg); // Enlève les paramètres par defaut pour éviter toute confusion possible.
        $this->connect();
    }
   
    // usinage : permet d'instancier la classe correcte en fonction de la db choisie
    public static function factory ($type, $host=NULL, $user=NULL, $passwd=NULL, $name=NULL) {
        if (class_exists ($type)) {
            $className = $type;
            return new $className ($host, $user, $passwd, $name);
        } else {
            throw new Exception ('Pas d\'implémentation disponible pour ' . $type);
        }
    }
    
    // n'autorise qu'une seule instance de la classe
    public static function singleton () {
        if (!isset(self::$instance)) {
            $c = __CLASS__;
            self::$instance = new $c;
        }
    return self::$instance;
    }

    // on avertit le développeur qu'il n'a pas le droit de cloner l'objet instancié
    public function __clone() {
       trigger_error('Le clônage n\'est pas autorisé.', E_USER_ERROR);
    }

    // méthodes abstraites
    abstract protected function connect();
    abstract public function __destruct();
    abstract public function query($sql, $desc=NULL);
    abstract public function fetch_assoc($query=NULL);
    /*
    abstract public function num_rows($query=NULL);
    abstract public function fetch_row($query=NULL);
    abstract public function fetch_array($query=NULL);
    abstract public function free();

  • /
} ?> //fichier mysql.cls.php <?php class mysql extends dbfactory { protected $default_cfg = array( 'host' => 'localhost', 'user' => 'root', 'passwd' => '', 'name' => 'test'); // connection à la base protected function connect () { $this->_config['link'] = @mysql_connect($this->_config['host'], $this->_config['user'], $this->_config['passwd']); if (!$this->_config['link'] ) { throw new Exception('Erreur lors de la connection vers : '.$this->_config['host'].'.'); } $this->_config['base'] = @mysql_select_db($this->_config['name'], $this->_config['link']); if (!$this->_config['base'] ) { throw new Exception('Erreur lors de l\'ouverture de la base de donnée : '.$this->_config['name'].'.'); unset($this->_config); } echo 'connection réussie avec '.__CLASS__; } // Fermeture de la base de données au moment de la destruction de la classe. public function __destruct() { mysql_close($this->_config['link']); } // création d'une requête et historisation public function query ($sql, $desc=NULL) { $start = microtime (true); $this->query = @mysql_query ($sql, $this->_config['link'] ); $query_time = microtime (true) - $start; if ($this->query) { $this->query_id++; $this->history[$this->query_id] = array('desc' => $desc, 'query' => $sql, 'time' => $query_time); return $this->query; } else { throw new Exception (mysql_error() ); return false; } } // récupère les résultats dans un tableau associatif public function fetch_assoc ($query=NULL) { if (isset($query)) { $this->query = $query; } return mysql_fetch_assoc ($this->query); } } ?> //fichier mssql.cls.php <?php class mssql extends dbfactory { protected $default_cfg = array( 'host' => 'localhost', 'user' => 'root', 'passwd' => '', 'name' => 'test'); // connection à la base protected function connect () { $this->_config['link'] = @mssql_connect($this->_config['host'], $this->_config['user'], $this->_config['passwd']); if (!$this->_config['link'] ) { throw new Exception('Erreur lors de la connection vers : '.$this->_config['host'].'.'); } $this->_config['base'] = @mssql_select_db($this->_config['name'], $this->_config['link']); if (!$this->_config['base'] ) { throw new Exception('Erreur lors de l\'ouverture de la base de donnée : '.$this->_config['name'].'.'); unset($this->_config); } echo 'connection réussie avec '.__CLASS__; } // Fermeture de la base de données au moment de la destruction de la classe. public function __destruct() { mssql_close($this->_config['link']); } public function query ($sql, $desc=NULL) { $start = microtime(true); $this->query = @mssql_query ($sql, $this->_config['link'] ); $query_time = microtime (true) - $start; if ($this->query) { $this->query_id++; $this->history[$this->query_id] = array ('desc' => $desc, 'query' => $sql, 'time' => $query_time); return $this->query; } else { throw new Exception (mssql_erget_last_message()); return false; } } public function fetch_assoc ($query=NULL) { if (isset ($query)) { $this->query = $query; } return mssql_fetch_assoc ($this->query); } } ?> //fichier index.php exemple <?php // on utilise la fonction magique __autoload pour charger automatiquement tous les fichiers de classe lorsqu'un appel est demandé. function __autoload($class_name) { require_once ($_SERVER['DOCUMENT_ROOT'].'/tests/classes/'.$class_name . '.cls.php'); } try { $db = dbfactory::factory ('mysql', 'localhost', 'root', '', 'test'); } catch (Exception $e) { die($e->getmessage()); } $requete = $db->query ('SELECT * FROM te', 'test de requête'); while ($res = $db->fetch_assoc ($requete)) { echo '<br />', $res['1'], '<br />'; } var_dump ($db->history); ?>

Conclusion :


J'ajouterai de vraies fonctionnalités plus tard peut-être.
En attendant, vous n'avez plus qu'à implémenter (un simple copier coller suffit pour la version mysql) celles développées par FhX dans sa classe.

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.