* @author Raphaël Droz * @author Jean-Pascal MILCENT * @author Aurelien PERONNET * @license GPL v3 * @license CECILL v2 * @copyright 1999-2014 Tela Botanica */ class Bdd extends PDO { 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'; public function __construct($config, $base = 'database_cel') { $cfg = $config[$base]; // 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 parent::__construct($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ée) parent::setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch (PDOException $e) { echo 'La connexion à la base de donnée via PDO a échoué : ' .$dsn . "\n". $e->getMessage(); } } /** * 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) { return $this->executerRequete($requete, $retour, $mode); } /** * Execute la requete retournant une seule ligne de résultat. * @param String $requete */ public function requeterLigne($requete, $mode = PDO::FETCH_ASSOC) { return $this->executerRequete($requete, self::SQL_RETOUR_LIGNE, $mode); } /** * Execute la requete retournant une seule colone de résultat. * @param String $requete */ public function requeterValeurUnique($requete, $mode = PDO::FETCH_ASSOC) { return $this->executerRequete($requete, self::SQL_RETOUR_COLONNE, $mode); } public function executerRequete($requete, $retour = self::SQL_RETOUR_COMPLET, $mode = PDO::FETCH_ASSOC) { $resultat = false; try { switch ($retour) { case self::SQL_RETOUR_COMPLET : $resultat = $this->query($requete)->fetchAll($mode);// Retourne toutes les lignes break; case self::SQL_RETOUR_LIGNE : $resultat = $this->query($requete)->fetch($mode);// Retourne la première ligne break; case self::SQL_RETOUR_COLONNE : $resultat = $this->query($requete)->fetchColumn();// Retourne la première colonne de la première ligne break; case self::SQL_RETOUR_BRUT : $resultat = $this->query($requete);// Retourne l'objet brut pour être utilisé dans une boucle de type foreach break; default: $this->debug[] = "Le type de retour '$retour' est inconnu."; } if ($resultat === false) { $this->debug[] = "La requête a retourné aucun résultat : $requete"; } } catch (PDOException $e) { $msgTpl = "Requête echec.\nFichier : %s.\nLigne : %s.\nMessage : %s.\nRequête : %s"; $this->debug[] = sprintf($msgTpl, $e->getFile(), $e->getLine(), $e->getMessage(), $requete); } return $resultat; } /** * Execute la requete retournant l'objet brut de résultat pour l'utiliser dans un foreach. * @param String $requete */ public function requeterBrut($requete) { return $this->executerRequete($requete, self::SQL_RETOUR_BRUT); } public function executer($requete) { try { $resultat = $this->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($donnees) { if (is_array($donnees)) { $retour = $this->protegerTableau($donnees); } else { $retour = $this->quote($donnees); } return $retour; } private function protegerTableau(Array $tableau) { foreach ($tableau as $id => $val) { if (is_array($val)) { $tableau[$id] = $this->protegerTableau($val); } else { $tableau[$id] = $this->proteger($val); } } return $tableau; } public function obtenirDernierId() { return $this->lastInsertId(); } }