* @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 lignes break; case self::SQL_RETOUR_LIGNE : $resultat = $this->bdd->query($requete)->fetch($mode);// Retourne la première ligne break; case self::SQL_RETOUR_COLONNE : $resultat = $this->bdd->query($requete)->fetchColumn();// Retourne la première colonne de la première ligne break; case self::SQL_RETOUR_BRUT : $resultat = $this->bdd->query($requete);// Retourne l'objet brut pour être utilisé dans une boucle de type foreach break; 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 = "Fichier : {$e->getFile()} \nLigne : {$e->getLine()} \nMessage : {$e->getMessage()} \nRequête : $requete"; $code = E_USER_ERROR; throw new Exception($message, $code); } 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; } } ?>