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éesif (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;}}?>