Rev 1223 | Blame | Compare with Previous | Last modification | View Log | RSS feed
<?php/*** La classe de gestion de la base de données.** @category php 5.2* @package cel* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>* @copyright Copyright (c) 2012, Tela Botanica (accueil@tela-botanica.org)* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL* @license http://www.gnu.org/licenses/gpl.html Licence GNU-GPL* @version $Id$*/class Bdd {const SQL_MODE_ASSOC = PDO::FETCH_ASSOC;const SQL_MODE_OBJET = PDO::FETCH_OBJ;const SQL_RETOUR_COMPLET = 'All';const SQL_RETOUR_LIGNE = 'Row';const SQL_RETOUR_COLONNE = 'Column';const SQL_RETOUR_BRUT = 'Raw';private $bdd = null;public function __construct($cfg) {// ATTENTION : la connexin à la bdd peut échouer si l'host vaut localhost. Utiliser 127.0.0.1 à la place.$dsn = $cfg['phptype'].':dbname='.$cfg['database'].';host='.$cfg['hostspec'];try {// Création de la connexion en UTF-8 à la BDD$this->bdd = new PDO($dsn, $cfg['username'], $cfg['password'], array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'UTF8'"));// Affiche les erreurs détectées par PDO (sinon mode silencieux => aucune erreur affiché)$this->bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);} catch (PDOException $e) {$message = "La connexion à la base de donnée via PDO a échouée : $dsn {$e->getMessage()}";$code = E_USER_ERROR;throw new Exception($message, $code);}}/*** Protège automatiquement toutes les chaines comprises entre deux caractères '|'.* Puis execute la requete.* @see protegerRequete()* @param unknown_type $requete*/public function requeter($requete, $retour = self::SQL_RETOUR_COMPLET, $mode = PDO::FETCH_ASSOC) {$resultat = false;try {switch ($retour) {case self::SQL_RETOUR_COMPLET :$resultat = $this->bdd->query($requete)->fetchAll($mode);// Retourne toutes les lignesbreak;case self::SQL_RETOUR_LIGNE :$resultat = $this->bdd->query($requete)->fetch($mode);// Retourne la première lignebreak;case self::SQL_RETOUR_COLONNE :$resultat = $this->bdd->query($requete)->fetchColumn();// Retourne la première colonne de la première lignebreak;case self::SQL_RETOUR_BRUT :$resultat = $this->bdd->query($requete);// Retourne l'objet brut pour être utilisé dans une boucle de type foreachbreak;default:$message = "Le type de retour '$retour' est inconnu.";$code = E_USER_ERROR;throw new Exception($message, $code);}if ($resultat === false) {$message = "La requête a retourné aucun résultat : $requete";$code = E_USER_NOTICE;throw new Exception($message, $code);}} catch (PDOException $e) {$message = sprintf($this->getTxt('sql_erreur_requete'), $e->getFile(), $e->getLine(), $e->getMessage(), $requete);$code = E_USER_ERROR;throw new Exception($message, $code);}return $resultat;}/*** Protège automatiquement toutes les chaines comprises entre deux caractères '|'.* @see protegerRequete()* @param unknown_type $requete*/public function executer($requete) {$resultat = false;try {$resultat = $this->bdd->exec($requete);if ($resultat === false) {$this->debug[] = "La requête a échoué : $requete";}} catch (PDOException $e) {$message = sprintf($this->getTxt('sql_erreur_requete'), $e->getFile(), $e->getLine(), $e->getMessage(), $requete);$code = E_USER_ERROR;throw new Exception($message);}return $resultat;}public function proteger($element) {$element = is_array($element) ? $this->protegerTableau($element) : $this->protegerChaine($element);return $element;}private function protegerChaine($chaine) {return $this->bdd->quote($chaine);}private function protegerTableau(Array $tableau) {foreach ($tableau as $id => $val) {if (is_array($val)) {$tableau[$id] = $this->protegerTableau($val);} else {$tableau[$id] = $this->protegerChaine($val);}}return $tableau;}public function etreNull($valeur) {$etreNull = false;if ($valeur == '' || $valeur == null || $valeur == '000null' || $valeur == 'null' || $valeur == '*') {$etreNull = true;}return $etreNull;}public function getTxt($id) {$sortie = '';switch ($id) {case 'sql_erreur_requete' : $sortie = "Requête echec.\nFichier : %s.\nLigne : %s.\nMessage : %s.\nRequête : %s"; break;default : $sortie = $id;}return $sortie;}}?>