| 1721 | 
           raphael | 
           1 | 
           <?php
  | 
        
        
            | 
            | 
           2 | 
           /**
  | 
        
        
            | 
            | 
           3 | 
            * La classe de gestion de la base de données.
  | 
        
        
            | 
            | 
           4 | 
            *
  | 
        
        
            | 
            | 
           5 | 
            * @category php 5.2
  | 
        
        
            | 
            | 
           6 | 
            * @package cel
  | 
        
        
            | 
            | 
           7 | 
            * @author Raphaël Droz <raphael@tela-botanica.org>
  | 
        
        
            | 
            | 
           8 | 
            * @copyright Copyright (c) 2013, Tela Botanica (accueil@tela-botanica.org)
  | 
        
        
            | 
            | 
           9 | 
            * @license	http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
  | 
        
        
            | 
            | 
           10 | 
            * @license	http://www.gnu.org/licenses/gpl.html Licence GNU-GPL
  | 
        
        
            | 
            | 
           11 | 
            */
  | 
        
        
            | 
            | 
           12 | 
           class Bdd2 extends PDO {
  | 
        
        
            | 
            | 
           13 | 
              | 
        
        
            | 
            | 
           14 | 
           	const SQL_MODE_ASSOC = PDO::FETCH_ASSOC;
  | 
        
        
            | 
            | 
           15 | 
           	const SQL_MODE_OBJET = PDO::FETCH_OBJ;
  | 
        
        
            | 
            | 
           16 | 
           	const SQL_RETOUR_COMPLET = 'All';
  | 
        
        
            | 
            | 
           17 | 
           	const SQL_RETOUR_LIGNE = 'Row';
  | 
        
        
            | 
            | 
           18 | 
           	const SQL_RETOUR_COLONNE = 'Column';
  | 
        
        
            | 
            | 
           19 | 
           	const SQL_RETOUR_BRUT = 'Raw';
  | 
        
        
            | 
            | 
           20 | 
              | 
        
        
            | 
            | 
           21 | 
           	function __construct($config, $base = 'database_cel') {
  | 
        
        
            | 
            | 
           22 | 
                   $cfg = $config[$base];
  | 
        
        
            | 
            | 
           23 | 
                   // ATTENTION : la connexin à la bdd peut échouer si l'host vaut localhost. Utiliser 127.0.0.1 à la place.
  | 
        
        
            | 
            | 
           24 | 
           		$dsn = $cfg['phptype'].':dbname='.$cfg['database'].';host='.$cfg['hostspec'];
  | 
        
        
            | 
            | 
           25 | 
           		try {
  | 
        
        
            | 
            | 
           26 | 
               		// Création de la connexion en UTF-8 à la BDD
  | 
        
        
            | 
            | 
           27 | 
           			parent::__construct($dsn, $cfg['username'], $cfg['password'], array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'UTF8'"));
  | 
        
        
            | 
            | 
           28 | 
           			// Affiche les erreurs détectées par PDO (sinon mode silencieux => aucune erreur affiché)
  | 
        
        
            | 
            | 
           29 | 
           			parent::setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  | 
        
        
            | 
            | 
           30 | 
           		} catch (PDOException $e) {
  | 
        
        
            | 
            | 
           31 | 
               		echo 'La connexion à la base de donnée via PDO a échouée : ' .$dsn . "\n". $e->getMessage();
  | 
        
        
            | 
            | 
           32 | 
           		}
  | 
        
        
            | 
            | 
           33 | 
           	}
  | 
        
        
            | 
            | 
           34 | 
              | 
        
        
            | 
            | 
           35 | 
           	/**
  | 
        
        
            | 
            | 
           36 | 
           	 * Protège automatiquement toutes les chaines comprises entre deux caractères '|'.
  | 
        
        
            | 
            | 
           37 | 
           	 * Puis execute la requete.
  | 
        
        
            | 
            | 
           38 | 
           	 * @see protegerRequete()
  | 
        
        
            | 
            | 
           39 | 
           	 * @param unknown_type $requete
  | 
        
        
            | 
            | 
           40 | 
           	 */
  | 
        
        
            | 
            | 
           41 | 
           	public function requeter($requete, $retour = self::SQL_RETOUR_COMPLET, $mode = PDO::FETCH_ASSOC) {
  | 
        
        
            | 
            | 
           42 | 
           		$requete = $this->protegerRequete($requete);
  | 
        
        
            | 
            | 
           43 | 
           		return $this->executerRequete($requete, $retour, $mode);
  | 
        
        
            | 
            | 
           44 | 
           	}
  | 
        
        
            | 
            | 
           45 | 
              | 
        
        
            | 
            | 
           46 | 
           	/**
  | 
        
        
            | 
            | 
           47 | 
           	 * Protège automatiquement toutes les chaines comprises entre deux caractères '|'.
  | 
        
        
            | 
            | 
           48 | 
           	 * @see protegerRequete()
  | 
        
        
            | 
            | 
           49 | 
           	 * @param unknown_type $requete
  | 
        
        
            | 
            | 
           50 | 
           	 */
  | 
        
        
            | 
            | 
           51 | 
           	public function executer($requete) {
  | 
        
        
            | 
            | 
           52 | 
           		$requete = $this->protegerRequete($requete);
  | 
        
        
            | 
            | 
           53 | 
           		return $this->executerRequeteSimple($requete);
  | 
        
        
            | 
            | 
           54 | 
           	}
  | 
        
        
            | 
            | 
           55 | 
              | 
        
        
            | 
            | 
           56 | 
           	/**
  | 
        
        
            | 
            | 
           57 | 
           	 * Méthode permettant de rechercher dans une requete SQL sous forme de chaine (String) les chaines
  | 
        
        
            | 
            | 
           58 | 
           	 * à protéger. Cela évite de protéger chaque variable avant de l'insérer dans une requete SQL.
  | 
        
        
            | 
            | 
           59 | 
           	 * Par contre, il est important que les chaine à protéger ne contiennent pas le caractère '|'.
  | 
        
        
            | 
            | 
           60 | 
           	 *
  | 
        
        
            | 
            | 
           61 | 
           	 * @param $requete
  | 
        
        
            | 
            | 
           62 | 
           	 */
  | 
        
        
            | 
            | 
           63 | 
           	public function protegerRequete($requete) {
  | 
        
        
            | 
            | 
           64 | 
           		if (substr_count($requete, '|') % 2 === 0) {
  | 
        
        
            | 
            | 
           65 | 
           			if (preg_match_all('/\|([^|]*)\|/', $requete, $correspondances, PREG_SET_ORDER)) {
  | 
        
        
            | 
            | 
           66 | 
           				foreach ($correspondances as $chaine) {
  | 
        
        
            | 
            | 
           67 | 
           					$chaine_protegee = $this->quote($chaine[1]);
  | 
        
        
            | 
            | 
           68 | 
           					$requete = str_replace($chaine[0], $chaine_protegee, $requete);
  | 
        
        
            | 
            | 
           69 | 
           				}
  | 
        
        
            | 
            | 
           70 | 
           			}
  | 
        
        
            | 
            | 
           71 | 
           		} else {
  | 
        
        
            | 
            | 
           72 | 
           			$this->messages[] = "La requête a protéger contient un nombre impair de caractère de protection '|'.";
  | 
        
        
            | 
            | 
           73 | 
           			$requete = false;
  | 
        
        
            | 
            | 
           74 | 
           		}
  | 
        
        
            | 
            | 
           75 | 
           		return $requete;
  | 
        
        
            | 
            | 
           76 | 
           	}
  | 
        
        
            | 
            | 
           77 | 
              | 
        
        
            | 
            | 
           78 | 
              | 
        
        
            | 
            | 
           79 | 
           	public function proteger($chaine) {
  | 
        
        
            | 
            | 
           80 | 
           		return $this->quote($chaine);
  | 
        
        
            | 
            | 
           81 | 
           	}
  | 
        
        
            | 
            | 
           82 | 
              | 
        
        
            | 
            | 
           83 | 
              | 
        
        
            | 
            | 
           84 | 
           	public function executerRequeteSimple($requete) {
  | 
        
        
            | 
            | 
           85 | 
           		$resultat = false;
  | 
        
        
            | 
            | 
           86 | 
           		try {
  | 
        
        
            | 
            | 
           87 | 
           			$resultat = $this->exec($requete);
  | 
        
        
            | 
            | 
           88 | 
           			if ($resultat === false) {
  | 
        
        
            | 
            | 
           89 | 
           				$this->debug[] = "La requête a échoué : $requete";
  | 
        
        
            | 
            | 
           90 | 
           			}
  | 
        
        
            | 
            | 
           91 | 
           		} catch (PDOException $e) {
  | 
        
        
           | 1912 | 
           raphael | 
           92 | 
           			$message = "Fichier : {$e->getFile()} \nLigne : {$e->getLine()} \nMessage : {$e->getMessage()} \nRequête : $requete";
  | 
        
        
            | 
            | 
           93 | 
           			$code = E_USER_ERROR;
  | 
        
        
            | 
            | 
           94 | 
           			throw new Exception($message, $code);
  | 
        
        
           | 1721 | 
           raphael | 
           95 | 
           		}
  | 
        
        
            | 
            | 
           96 | 
           		return $resultat;
  | 
        
        
            | 
            | 
           97 | 
           	}
  | 
        
        
            | 
            | 
           98 | 
              | 
        
        
            | 
            | 
           99 | 
           	public function executerRequete($requete, $retour = self::SQL_RETOUR_COMPLET, $mode = PDO::FETCH_ASSOC) {
  | 
        
        
            | 
            | 
           100 | 
           		$resultat = false;
  | 
        
        
            | 
            | 
           101 | 
           		try {
  | 
        
        
            | 
            | 
           102 | 
           			switch ($retour) {
  | 
        
        
            | 
            | 
           103 | 
           				case self::SQL_RETOUR_COMPLET :
  | 
        
        
            | 
            | 
           104 | 
           					$resultat = $this->query($requete)->fetchAll($mode);// Retourne toutes les lignes
  | 
        
        
            | 
            | 
           105 | 
           					break;
  | 
        
        
            | 
            | 
           106 | 
           				case self::SQL_RETOUR_LIGNE :
  | 
        
        
            | 
            | 
           107 | 
           					$resultat = $this->query($requete)->fetch($mode);// Retourne la première ligne
  | 
        
        
            | 
            | 
           108 | 
           					break;
  | 
        
        
            | 
            | 
           109 | 
           				case self::SQL_RETOUR_COLONNE :
  | 
        
        
            | 
            | 
           110 | 
           					$resultat = $this->query($requete)->fetchColumn();// Retourne la première colonne de la première ligne
  | 
        
        
            | 
            | 
           111 | 
           					break;
  | 
        
        
            | 
            | 
           112 | 
           				case self::SQL_RETOUR_BRUT :
  | 
        
        
            | 
            | 
           113 | 
           					$resultat = $this->query($requete);// Retourne l'objet brut pour être utilisé dans une boucle de type foreach
  | 
        
        
            | 
            | 
           114 | 
           					break;
  | 
        
        
            | 
            | 
           115 | 
           				default:
  | 
        
        
            | 
            | 
           116 | 
           					$this->debug[] = "Le type de retour '$retour' est inconnu.";
  | 
        
        
            | 
            | 
           117 | 
           			}
  | 
        
        
            | 
            | 
           118 | 
           			if ($resultat === false) {
  | 
        
        
            | 
            | 
           119 | 
           				$this->debug[] = "La requête a retourné aucun résultat : $requete";
  | 
        
        
            | 
            | 
           120 | 
           			}
  | 
        
        
            | 
            | 
           121 | 
           		} catch (PDOException $e) {
  | 
        
        
            | 
            | 
           122 | 
           			$this->debug[] = sprintf($this->getTxt('sql_erreur_requete'), $e->getFile(), $e->getLine(), $e->getMessage(), $requete);
  | 
        
        
            | 
            | 
           123 | 
           		}
  | 
        
        
            | 
            | 
           124 | 
           		return $resultat;
  | 
        
        
            | 
            | 
           125 | 
           	}
  | 
        
        
            | 
            | 
           126 | 
              | 
        
        
            | 
            | 
           127 | 
           	public function getTxt($id) {
  | 
        
        
            | 
            | 
           128 | 
           		$sortie = '';
  | 
        
        
            | 
            | 
           129 | 
           		switch ($id) {
  | 
        
        
            | 
            | 
           130 | 
           			case 'sql_erreur' : $sortie = 'Requête echec. Fichier : "%s". Ligne : "%s". Message : %s'; break;
  | 
        
        
            | 
            | 
           131 | 
           			case 'sql_erreur_requete' : $sortie = "Requête echec.\nFichier : %s.\nLigne : %s.\nMessage : %s.\nRequête : %s"; break;
  | 
        
        
            | 
            | 
           132 | 
           			default : $sortie = $id;
  | 
        
        
            | 
            | 
           133 | 
           		}
  | 
        
        
            | 
            | 
           134 | 
           		return $sortie;
  | 
        
        
            | 
            | 
           135 | 
           	}
  | 
        
        
            | 
            | 
           136 | 
              | 
        
        
            | 
            | 
           137 | 
           }
  |