* @license GPL v3 * @license CECILL v2 * @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; } } ?>