Subversion Repositories Applications.framework

Rev

Rev 34 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

<?php
/**
 * Classe modèle, donc d'accès au données, elle ne devrait pas être appelée de l'extérieur.
 * Elle fait office d'abstraction légère de base de données en utilisant les objects PDO natifs 
 * de PHP
 * Elle est abstraite donc doit obligatoirement être étendue.
 */
abstract class Modele {

        /**
         * registre global
         */
        private $registre;
        /**
         * Gestionnaire d'exceptions php
         */
        private $gestionnaire_exception;
        /**
         * Gestionnaire d'erreurs php
         */
        private $gestionnaire_erreur;
        /**
         * DSN pour accéder à la base de données
         */
        private $dsn;
        /**
         * Type de base de données (mysql, mysqli, etc ...)
         */
        private $type;
        /**
         * Hote herbergeant la base de données
         */
        private $hote;
        /**
         * Nom de la base de données à laquelle le modèle doit se connecter
         */
        private $bdd_nom;
        /**
         * Nom d'utilisateur
         */
        private $utilisateur;
        /**
         * Mot de passe
         */
        private $pass;
        /**
         * Connexion à la base de données
         */
        private $connexion = null;

        /**
         * Constructeur par défaut, appelé à l'initialisation
         */
    final public function __construct() {
        
        // les différents paramètres nécessaires sont lus à partir du registre
        $this->registre = Registre::getInstance();
        $this->gestionnaire_erreur = GestionnaireErreur::getInstance();
        $this->type = $this->registre->get('bdd_type');
        $this->hote = $this->registre->get('bdd_hote');
        $this->bdd_nom = $this->registre->get('bdd_nom');
        $this->utilisateur = $this->registre->get('bdd_utilisateur');
        $this->pass = $this->registre->get('bdd_pass');
        
        $this->dsn = $this->type.':dbname='.$this->bdd_nom.';host='.$this->hote;
    }
    
    /**
     * Fonction qui appelle la bonne fonction de requete suivant le type de bdd 
     * @param string la requete à effectuer
     * @return PDOStatement un objet contenant le résultat de la requête
     */
    final protected function requete($requete) {
        
        // on ne se connecte que lors du premier appel à une requete (lazy connexion)
        if($this->connexion == null) {
                $this->connecter();
        }
                
                return $this->connexion->query($requete);
    }
    
    /**
     * Connecte à la base de données en utilisant les informations fournies par 
     * le fichier de configuration, private et final car n'a pas vocation a être appelée
     * par l'utilisateur
     * @throws PDOException une exception dans le cas ou là connexion échoue
     */
    final private function connecter() {
        
        // TODO: retirer le try catch et laisser le problème au gestionnaire d'exceptions      
                try {
                    $this->connexion = new PDO($this->dsn,$this->utilisateur,$this->pass);
                } catch (PDOException $e) {

                }
    }
    
    /**
     * protège une chaine de caractères avant l'insertion dans la base de données  
     */
    final protected function proteger($chaine) {
        
        // on ne se connecte que lors du premier appel à une requete
        if($this->connexion == null) {
                $this->connecter();
        }
        
        return $this->connexion->quote($chaine);
    }
    
    /**
     * Destructeur de classe, se contente de fermer explicitement la connexion
     */
    final public function __destruct() {
        
        if($this->connexion != null) { 
                $this->connexion = null ;
        }
    }
}
?>