Subversion Repositories eFlore/Applications.cel

Rev

Rev 1720 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1720 Rev 1721
Line 11... Line 11...
11
 * @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
11
 * @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
12
 * @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
12
 * @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
13
 * @version $Id$
13
 * @version $Id$
14
 * @copyright © 2012, Tela Botanica
14
 * @copyright © 2012, Tela Botanica
15
 */
15
 */
16
// TODO : supprimer la méthode protegerRequete()
16
require_once('Bdd2.php');
-
 
17
 
17
abstract class Cel {
18
abstract class Cel {
18
	const TYPE_OBS = 'observation';
19
	const TYPE_OBS = 'observation';
19
	const TYPE_IMG = 'image';
20
	const TYPE_IMG = 'image';
-
 
21
 
-
 
22
	// TODO: delete wrappers
20
	const SQL_MODE_ASSOC = PDO::FETCH_ASSOC;
23
	const SQL_MODE_ASSOC = Bdd2::SQL_MODE_ASSOC;
21
	const SQL_MODE_OBJET = PDO::FETCH_OBJ;
24
	const SQL_MODE_OBJET = Bdd2::SQL_MODE_OBJET;
22
	const SQL_RETOUR_COMPLET = 'All';
25
	const SQL_RETOUR_COMPLET = Bdd2::SQL_RETOUR_COMPLET;
23
	const SQL_RETOUR_LIGNE = 'Row';
26
	const SQL_RETOUR_LIGNE = Bdd2::SQL_RETOUR_LIGNE;
24
	const SQL_RETOUR_COLONNE = 'Column';
27
	const SQL_RETOUR_COLONNE = Bdd2::SQL_RETOUR_COLONNE;
25
	const SQL_RETOUR_BRUT = 'Raw';
28
	const SQL_RETOUR_BRUT = Bdd2::SQL_RETOUR_BRUT;
Line 26... Line 29...
26
 
29
 
27
	public $config;
30
	public $config;
28
	private $ressources;
31
	private $ressources;
-
 
32
	protected $parametres = array();
29
	protected $parametres = array();
33
 
-
 
34
	public static $bdd = null;
30
	protected $bdd;
35
 
31
	protected $messages = array();
36
	protected $messages = array();
32
	protected $debug = array();
37
	protected $debug = array();
33
	protected $start;
38
	protected $start;
Line 42... Line 47...
42
		// Réglages de PHP
47
		// Réglages de PHP
43
		setlocale(LC_ALL, $this->config['settings']['locale']);
48
		setlocale(LC_ALL, $this->config['settings']['locale']);
44
		date_default_timezone_set($this->config['settings']['fuseauHoraire']);
49
		date_default_timezone_set($this->config['settings']['fuseauHoraire']);
Line 45... Line 50...
45
 
50
 
46
		// Connection à la base de données
51
		// Connection à la base de données
Line 47... Line 52...
47
		$this->bdd = $this->connecterPDO($this->config, 'database_cel');
52
		self::$bdd = new Bdd2($this->config, 'database_cel');
48
 
53
 
49
		// Nettoyage du _GET (sécurité)
54
		// Nettoyage du _GET (sécurité)
50
		$this->collecterParametres();// Récupération de tous les parametres de _GET, nettoyage et mise dans $this->parametres
55
		$this->collecterParametres();// Récupération de tous les parametres de _GET, nettoyage et mise dans $this->parametres
Line 54... Line 59...
54
		// Définition de variable générale dans la config
59
		// Définition de variable générale dans la config
55
		$this->config['settings']['baseURLAbsoluDyn'] = 'http://'.$_SERVER['SERVER_NAME'].$this->config['settings']['baseURL'].'%s';
60
		$this->config['settings']['baseURLAbsoluDyn'] = 'http://'.$_SERVER['SERVER_NAME'].$this->config['settings']['baseURL'].'%s';
56
	}
61
	}
Line 57... Line 62...
57
 
62
 
58
	//+----------------------------------------------------------------------------------------------------------------+
-
 
59
	// GESTION de la BASE de DONNÉES
-
 
60
 
63
	//+----------------------------------------------------------------------------------------------------------------+
61
	protected function connecterPDO($config, $base = 'database_cel') {
64
	protected function connecterPDO($config, $base = 'database_cel') {
62
        $cfg = $config[$base];
-
 
63
        // ATTENTION : la connexin à la bdd peut échouer si l'host vaut localhost. Utiliser 127.0.0.1 à la place.
-
 
64
		$dsn = $cfg['phptype'].':dbname='.$cfg['database'].';host='.$cfg['hostspec'];
-
 
65
		try {
-
 
66
    		// Création de la connexion en UTF-8 à la BDD
-
 
67
			$PDO = new PDO($dsn, $cfg['username'], $cfg['password'], array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'UTF8'"));
-
 
68
			// Affiche les erreurs détectées par PDO (sinon mode silencieux => aucune erreur affiché)
-
 
69
			$PDO->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
-
 
70
		} catch (PDOException $e) {
-
 
71
    		echo 'La connexion à la base de donnée via PDO a échouée : ' .$dsn. $e->getMessage();
-
 
72
		}
-
 
73
        return $PDO;
65
		return new Bdd2($config, $base);
Line 74... Line -...
74
	}
-
 
75
 
-
 
76
	/**
-
 
77
	 * Protège automatiquement toutes les chaines comprises entre deux caractères '|'.
-
 
78
	 * Puis execute la requete.
66
	}
79
	 * @see protegerRequete()
-
 
80
	 * @param unknown_type $requete
-
 
81
	 */
67
 
82
	public function requeter($requete, $retour = self::SQL_RETOUR_COMPLET, $mode = PDO::FETCH_ASSOC) {
68
	public static function db() {
83
		$requete = $this->protegerRequete($requete);
69
		if(! self::$bdd) die('ERR: no DB available');
Line 84... Line -...
84
		return $this->executerRequete($requete, $retour, $mode);
-
 
85
	}
70
		return self::$bdd;
86
 
-
 
87
	/**
-
 
88
	 * Protège automatiquement toutes les chaines comprises entre deux caractères '|'.
-
 
89
	 * @see protegerRequete()
71
	}
90
	 * @param unknown_type $requete
72
 
91
	 */
73
	// TODO: delete wrappers, en attendant que $this->bdd soit remplacé par Cel::db() partout.
92
	protected function executer($requete) {
74
	public function __get($prop) {
Line 93... Line -...
93
		$requete = $this->protegerRequete($requete);
-
 
94
		return $this->executerRequeteSimple($requete);
-
 
95
	}
-
 
96
 
-
 
97
	/**
-
 
98
	 * Méthode permettant de rechercher dans une requete SQL sous forme de chaine (String) les chaines
75
		if($prop == 'bdd') return self::$bdd;
99
	 * à protéger. Cela évite de protéger chaque variable avant de l'insérer dans une requete SQL.
-
 
100
	 * Par contre, il est important que les chaine à protéger ne contiennent pas le caractère '|'.
76
		return $this->$prop;
101
	 *
-
 
102
	 * @param $requete
-
 
103
	 */
-
 
104
	protected function protegerRequete($requete) {
-
 
105
		if (substr_count($requete, '|') % 2 === 0) {
77
	}
106
			if (preg_match_all('/\|([^|]*)\|/', $requete, $correspondances, PREG_SET_ORDER)) {
-
 
107
				foreach ($correspondances as $chaine) {
-
 
108
					$chaine_protegee = $this->bdd->quote($chaine[1]);
-
 
109
					$requete = str_replace($chaine[0], $chaine_protegee, $requete);
-
 
110
				}
-
 
111
			}
-
 
112
		} else {
-
 
113
			$this->messages[] = "La requête a protéger contient un nombre impair de caractère de protection '|'.";
78
 
-
 
79
	// TODO: delete wrappers
-
 
80
	public function requeter() {
-
 
81
		return call_user_func_array(array(self::$bdd, __FUNCTION__), func_get_args());
114
			$requete = false;
82
	}
-
 
83
	// TODO: delete wrappers
115
		}
84
	protected function executer() {
-
 
85
		return call_user_func_array(array(self::$bdd, __FUNCTION__), func_get_args());
-
 
86
	}
-
 
87
	// TODO: delete wrappers
116
		return $requete;
88
	protected function protegerRequete() {
-
 
89
		return call_user_func_array(array(self::$bdd, __FUNCTION__), func_get_args());
117
	}
90
	}
Line 118... Line 91...
118
 
91
	// TODO: delete wrappers
119
	protected function proteger($chaine) {
92
	protected function proteger() {
120
		return $this->bdd->quote($chaine);
93
		return call_user_func_array(array(self::$bdd, __FUNCTION__), func_get_args());
121
	}
94
	}
122
 
95
 
123
	protected function protegerTableau(Array $tableau) {
96
	protected function protegerTableau(Array $tableau) {
Line 124... Line -...
124
		foreach ($tableau as $id => $val) {
-
 
125
			$tableau[$id] = $this->proteger($val);
97
		foreach ($tableau as $id => $val) {
126
		}
-
 
127
		return $tableau;
98
			$tableau[$id] = $this->proteger($val);
128
	}
-
 
129
 
-
 
130
	protected function executerRequeteSimple($requete) {
-
 
131
		$resultat = false;
-
 
132
		try {
99
		}
133
			$resultat = $this->bdd->exec($requete);
-
 
134
			if ($resultat === false) {
-
 
135
				$this->debug[] = "La requête a échoué : $requete";
100
		return $tableau;
136
			}
-
 
137
		} catch (PDOException $e) {
-
 
138
			$this->debug[] = sprintf($this->getTxt('sql_erreur_requete'), $e->getFile(), $e->getLine(), $e->getMessage(), $requete);
-
 
139
		}
-
 
140
		return $resultat;
101
	}
141
	}
-
 
142
 
-
 
143
	public function executerRequete($requete, $retour = self::SQL_RETOUR_COMPLET, $mode = PDO::FETCH_ASSOC) {
-
 
144
		$resultat = false;
-
 
145
		try {
-
 
146
			switch ($retour) {
-
 
147
				case self::SQL_RETOUR_COMPLET :
-
 
148
					$resultat = $this->bdd->query($requete)->fetchAll($mode);// Retourne toutes les lignes
-
 
149
					break;
-
 
150
				case self::SQL_RETOUR_LIGNE :
-
 
151
					$resultat = $this->bdd->query($requete)->fetch($mode);// Retourne la première ligne
-
 
152
					break;
-
 
153
				case self::SQL_RETOUR_COLONNE :
-
 
154
					$resultat = $this->bdd->query($requete)->fetchColumn();// Retourne la première colonne de la première ligne
-
 
155
					break;
-
 
156
				case self::SQL_RETOUR_BRUT :
-
 
157
					$resultat = $this->bdd->query($requete);// Retourne l'objet brut pour être utilisé dans une boucle de type foreach
-
 
158
					break;
-
 
159
				default:
102
 
160
					$this->debug[] = "Le type de retour '$retour' est inconnu.";
103
	// TODO: delete wrappers
161
			}
-
 
162
			if ($resultat === false) {
-
 
163
				$this->debug[] = "La requête a retourné aucun résultat : $requete";
104
	protected function executerRequeteSimple() {
164
			}
105
		return call_user_func_array(array(self::$bdd, __FUNCTION__), func_get_args());
-
 
106
	}
165
		} catch (PDOException $e) {
107
	// TODO: delete wrappers
166
			$this->debug[] = sprintf($this->getTxt('sql_erreur_requete'), $e->getFile(), $e->getLine(), $e->getMessage(), $requete);
-
 
167
		}
-
 
168
		return $resultat;
108
	public function executerRequete() {
169
	}
-
 
170
 
-
 
171
	protected function getTxt($id) {
-
 
172
		$sortie = '';
-
 
173
		switch ($id) {
109
		return call_user_func_array(array(self::$bdd, __FUNCTION__), func_get_args());
Line 174... Line 110...
174
			case 'sql_erreur' : $sortie = 'Requête echec. Fichier : "%s". Ligne : "%s". Message : %s'; break;
110
	}
175
			case 'sql_erreur_requete' : $sortie = "Requête echec.\nFichier : %s.\nLigne : %s.\nMessage : %s.\nRequête : %s"; break;
111
 
Line 229... Line 165...
229
	protected function traiterParametres($params_attendu, $params, $pourBDD = true) {
165
	protected function traiterParametres($params_attendu, $params, $pourBDD = true) {
230
		$sortie = array();
166
		$sortie = array();
231
		foreach ($params_attendu as $num => $nom) {
167
		foreach ($params_attendu as $num => $nom) {
232
			if (isset($params[$num]) && $params[$num] != '*') {
168
			if (isset($params[$num]) && $params[$num] != '*') {
233
				if ($pourBDD) {
169
				if ($pourBDD) {
234
					$params[$num] = $this->bdd->quote($params[$num]);
170
					$params[$num] = self::$bdd->quote($params[$num]);
235
				}
171
				}
236
				$sortie[$nom] = $params[$num];
172
				$sortie[$nom] = $params[$num];
237
			}
173
			}
238
		}
174
		}
239
		return $sortie;
175
		return $sortie;
Line 671... Line 607...
671
	}
607
	}
Line 672... Line 608...
672
 
608
 
673
	private function decoderMotsCles($utilisateur_id, $mots_cles, $type) {
609
	private function decoderMotsCles($utilisateur_id, $mots_cles, $type) {
674
		$mots = array();
610
		$mots = array();
675
		if (! $this->etreNull($mots_cles)) {
611
		if (! $this->etreNull($mots_cles)) {
Line 676... Line 612...
676
			$utilisateur_id = $this->bdd->quote($utilisateur_id);
612
			$utilisateur_id = self::$bdd->quote($utilisateur_id);
677
 
613
 
678
			$mots_cles = $this->protegerMotsCles($mots_cles, $type);
614
			$mots_cles = $this->protegerMotsCles($mots_cles, $type);
Line 703... Line 639...
703
 
639
 
704
	protected function traiterValeursMultiples($valeurs, $separateur_entree = ',' , $separateur_sortie = ',') {
640
	protected function traiterValeursMultiples($valeurs, $separateur_entree = ',' , $separateur_sortie = ',') {
705
		if (! $this->etreNull($valeurs)) {
641
		if (! $this->etreNull($valeurs)) {
706
			$valeurs_a_proteger = explode($separateur_entree,trim(trim($valeurs), $separateur_entree));
642
			$valeurs_a_proteger = explode($separateur_entree,trim(trim($valeurs), $separateur_entree));
707
			foreach ($valeurs_a_proteger as $valeur) {
643
			foreach ($valeurs_a_proteger as $valeur) {
708
				$valeurs_protegees[] = $this->bdd->quote($valeur);
644
				$valeurs_protegees[] = self::$bdd->quote($valeur);
709
			}
645
			}
710
			$valeurs = implode($separateur_sortie, $valeurs_protegees);
646
			$valeurs = implode($separateur_sortie, $valeurs_protegees);
711
		}
647
		}
712
		return ($this->etreNull($valeurs)) ? null : $valeurs;
648
		return ($this->etreNull($valeurs)) ? null : $valeurs;