Subversion Repositories Applications.referentiel

Rev

Rev 141 | Blame | Compare with Previous | Last modification | View Log | RSS feed

<?php
/**
 * Classe mère abstraite contenant les méthodes génériques des services des Référentiels.
 * Encodage en entrée : utf8
 * Encodage en sortie : utf8
 * 
 * @category    Php 5.2
 * @package             Referentiel
 * @author              Jean-Pascal MILCENT <jpm@tela-botanica.org>
 * @license             GPL v3 <http://www.gnu.org/licenses/gpl.txt>
 * @license             CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
 * @copyright   2010 Tela-Botanica
 * @version             $Id$
 */
abstract class Ref {
        
        public $config;
        protected $bdd;
        protected $messages = array();
        protected $debug = array();
        protected $distinct = false;
        protected $orderby = null;
        protected $formatRetour = 'objet';
        protected $start = 0;
        protected $limit = 150;
        
        public function __construct($config, $demarrer_session = true) {
                // Tableau contenant la config de Jrest
                $this->config = $config;
                
                // Connection à la base de données
                $this->bdd = $this->connecterPDO($this->config, 'database');
                
                // Nettoyage du $_GET (sécurité)
                if (isset($_GET)) {
                        $get_params = array('orderby', 'distinct', 'start', 'limit', 'formatRetour');
                        foreach ($get_params as $get) {
                                if (isset($_GET[$get])) {
                                        $verifier = array('NULL', "\n", "\r", "\\", "'", '"', "\x00", "\x1a", ';');
                                        $_GET[$get] = strip_tags(str_replace($verifier, '', $_GET[$get]));
                                        if ($_GET[$get] != '') {
                                                $this->$get = $_GET[$get];
                                        } else {
                                                $_GET[$get] = null;
                                        }
                                }
                        }
                }
        }

        /**
         * Méthode appelée quand aucun paramètre n'est passé dans l'url et avec une requête de type GET.
         */
        public function getRessource() {
                $this->getElement(array());
        }
        
        protected function envoyer($donnees = null, $mime = 'text/html', $encodage = 'utf-8', $json = true) {
                // Traitements des messages d'erreurs et données
                if (count($this->messages) != 0) {
                        header('HTTP/1.1 424 Method failure');
                        $sortie = $this->messages;
                        // En plus de la réponse, nous passons les messages dans l'entete car la réponse ne peut pas être récupérée
                        // avec ce type d'erreur HTTP en php..
                        // FIXME : comment récupérer en php le contenu de la réponse portant le code HTTP 424 ou 500
                        $this->envoyerEnteteMessage();
                } else {
                        $sortie = $donnees;
                }

                // Gestion de l'envoie du déboguage
                $this->envoyerEnteteDebogage();
                
                // Encodage au format et JSON et envoie sur la sortie standard
                $contenu = $json ? json_encode($sortie) : $sortie;
                $mime = $json ? 'application/json' : $mime;
                $this->envoyerContenu($encodage, $mime, $contenu);
        }
        
        protected function envoyerEnteteMessage() {
                if (!is_array($this->messages)) {
                        $this->messages[] = $this->messages;
                }
                if (count($this->messages) != 0) {
                        foreach ($this->messages as $cle => $val) {
                                if (is_array($val)) {
                                        $this->messages[$cle] = print_r($val, true);
                                }
                        }
                        header('X-MessageJrest-Data: '.json_encode($this->messages));
                }
        }
        
        protected function envoyerEnteteDebogage() {
                if (!is_array($this->debug)) {
                        $this->debug[] = $this->debug;
                }
                if (count($this->debug) != 0) {
                        foreach ($this->debug as $cle => $val) {
                                if (is_array($val)) {
                                        $this->debug[$cle] = print_r($val, true);
                                }
                        }
                        header('X-DebugJrest-Data: '.json_encode($this->debug));
                }
        }
        
        protected function envoyerContenu($encodage, $mime, $contenu) {
                header("Content-Type: $mime; charset=$encodage");
                print $contenu;
        }
        
        private function connecterPDO($config, $base = 'database') {
        $cfg = $config[$base];
                $dsn = $cfg['phptype'].':dbname='.$cfg['database'].';host='.$cfg['hostspec'];
                try {
                $PDO = new PDO($dsn, $cfg['username'], $cfg['password']);
                } catch (PDOException $e) {
                echo 'La connexion à la base de donnée via PDO a échouée : ' . $e->getMessage();
                }
                // Passe en UTF-8 la connexion à la BDD
                $PDO->exec("SET NAMES 'utf8'");
                // Affiche les erreurs détectées par PDO (sinon mode silencieux => aucune erreur affiché)
                $PDO->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        return $PDO;
        }
        
        protected function executerRequete($requete, $message_echec) {
                try {
                        $infos = $this->bdd->query($requete)->fetchAll(PDO::FETCH_ASSOC);
                        if ($infos === false) {
                                $this->messages[] = $message_echec;
                        }
                } catch (PDOException $e) {
                        $this->messages[] = sprintf($this->getTxt('sql_erreur_requete'), $e->getFile(), $e->getLine(), $e->getMessage(), $requete);
                }
                return $infos;
        }
        
        protected function getTxt($id) {
                $sortie = '';
                switch ($id) {
                        case 'sql_erreur' : $sortie = 'Requête echec. Fichier : "%s". Ligne : "%s". Message : %s'; break;
                        case 'sql_erreur_requete' : $sortie = "Requête echec.\nFichier : %s.\nLigne : %s.\nMessage : %s.\nRequête : %s"; break;
                        default : $sortie = $id; 
                }
                return $sortie;
        }
        
        protected function traiterParametresUrl($params_attendu, $params, $pourBDD = true) {
                $sortie = array();
                foreach ($params_attendu as $num => $nom) {
                        if (isset($params[$num]) && $params[$num] != '*') {
                                if ($pourBDD) {
                                        $params[$num] = $this->bdd->quote($params[$num]);
                                }
                                $sortie[$nom] = $params[$num];
                        }
                }
                return $sortie;
        }
        
        protected function traiterParametresPost($params_attendu, $params, $pourBDD = true) {
                $sortie = array();
                foreach ($params_attendu as $num => $nom) {
                        if (isset($params[$nom]) && $params[$nom] != '') {
                                if ($pourBDD) {
                                        $params[$nom] = $this->bdd->quote($params[$nom]);
                                }
                                $sortie[$nom] = $params[$nom];
                        } else {
                                if ($pourBDD) {
                                        $sortie[$nom] = 'NULL';
                                } else {
                                        $sortie[$nom] = '';
                                }
                        }
                }
                return $sortie;
        }
        
        protected function traiterBddClauseIn($chaine) {
                $sortie = '';
                $chaine = trim($chaine, " '");
                if ($chaine != '') {
                        $valeurs = explode(',', $chaine);
                        foreach ($valeurs as $id => $valeur) {
                                $valeurs[$id] = $this->bdd->quote($valeur);
                        }
                        $sortie = implode(',', $valeurs);
                }
                return $sortie;
        }
}
?>