Subversion Repositories eFlore/Applications.cel

Rev

Rev 1755 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1755 Rev 1765
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 46... Line 51...
46
		// Réglages de PHP
51
		// Réglages de PHP
47
		setlocale(LC_ALL, $this->config['settings']['locale']);
52
		setlocale(LC_ALL, $this->config['settings']['locale']);
48
		date_default_timezone_set($this->config['settings']['fuseauHoraire']);
53
		date_default_timezone_set($this->config['settings']['fuseauHoraire']);
Line 49... Line 54...
49
 
54
 
50
		// Connection à la base de données
55
		// Connection à la base de données
Line 51... Line 56...
51
		$this->bdd = $this->connecterPDO($this->config, 'database_cel');
56
		self::$bdd = new Bdd2($this->config, 'database_cel');
52
 
57
 
53
		// Nettoyage du _GET (sécurité)
58
		// Nettoyage du _GET (sécurité)
54
		$this->collecterParametres();// Récupération de tous les parametres de _GET, nettoyage et mise dans $this->parametres
59
		$this->collecterParametres();// Récupération de tous les parametres de _GET, nettoyage et mise dans $this->parametres
Line 58... Line 63...
58
		// Définition de variable générale dans la config
63
		// Définition de variable générale dans la config
59
		$this->config['settings']['baseURLAbsoluDyn'] = 'http://'.$_SERVER['SERVER_NAME'].$this->config['settings']['baseURL'].'%s';
64
		$this->config['settings']['baseURLAbsoluDyn'] = 'http://'.$_SERVER['SERVER_NAME'].$this->config['settings']['baseURL'].'%s';
60
	}
65
	}
Line 61... Line 66...
61
 
66
 
62
	//+----------------------------------------------------------------------------------------------------------------+
-
 
63
	// GESTION de la BASE de DONNÉES
-
 
64
 
67
	//+----------------------------------------------------------------------------------------------------------------+
65
	protected function connecterPDO($config, $base = 'database_cel') {
68
	protected function connecterPDO($config, $base = 'database_cel') {
66
        $cfg = $config[$base];
-
 
67
        // ATTENTION : la connexin à la bdd peut échouer si l'host vaut localhost. Utiliser 127.0.0.1 à la place.
-
 
68
		$dsn = $cfg['phptype'].':dbname='.$cfg['database'].';host='.$cfg['hostspec'];
-
 
69
		try {
-
 
70
    		// Création de la connexion en UTF-8 à la BDD
-
 
71
			$PDO = new PDO($dsn, $cfg['username'], $cfg['password'], array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'UTF8'"));
-
 
72
			// Affiche les erreurs détectées par PDO (sinon mode silencieux => aucune erreur affiché)
-
 
73
			$PDO->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
-
 
74
		} catch (PDOException $e) {
-
 
75
    		echo 'La connexion à la base de donnée via PDO a échouée : ' .$dsn. $e->getMessage();
-
 
76
		}
-
 
77
        return $PDO;
69
		return new Bdd2($config, $base);
Line 78... Line -...
78
	}
-
 
79
 
-
 
80
	/**
-
 
81
	 * Protège automatiquement toutes les chaines comprises entre deux caractères '|'.
-
 
82
	 * Puis execute la requete.
70
	}
83
	 * @see protegerRequete()
-
 
84
	 * @param unknown_type $requete
-
 
85
	 */
71
 
86
	public function requeter($requete, $retour = self::SQL_RETOUR_COMPLET, $mode = PDO::FETCH_ASSOC) {
72
	public static function db() {
87
		$requete = $this->protegerRequete($requete);
73
		if(! self::$bdd) die('ERR: no DB available');
Line 88... Line -...
88
		return $this->executerRequete($requete, $retour, $mode);
-
 
89
	}
74
		return self::$bdd;
90
 
-
 
91
	/**
-
 
92
	 * Protège automatiquement toutes les chaines comprises entre deux caractères '|'.
-
 
93
	 * @see protegerRequete()
75
	}
94
	 * @param unknown_type $requete
76
 
95
	 */
-
 
96
	protected function executer($requete) {
-
 
97
		$requete = $this->protegerRequete($requete);
-
 
98
		return $this->executerRequeteSimple($requete);
-
 
99
	}
-
 
100
 
-
 
101
	/**
-
 
102
	 * Méthode permettant de rechercher dans une requete SQL sous forme de chaine (String) les chaines
-
 
103
	 * à protéger. Cela évite de protéger chaque variable avant de l'insérer dans une requete SQL.
-
 
104
	 * Par contre, il est important que les chaine à protéger ne contiennent pas le caractère '|'.
-
 
105
	 *
-
 
106
	 * @param $requete
-
 
107
	 */
-
 
108
	protected function protegerRequete($requete) {
-
 
109
		if (substr_count($requete, '|') % 2 === 0) {
-
 
110
			if (preg_match_all('/\|([^|]*)\|/', $requete, $correspondances, PREG_SET_ORDER)) {
-
 
111
				foreach ($correspondances as $chaine) {
-
 
112
					$chaine_protegee = $this->bdd->quote($chaine[1]);
-
 
113
					$requete = str_replace($chaine[0], $chaine_protegee, $requete);
-
 
114
				}
-
 
115
			}
-
 
116
		} else {
-
 
117
			$this->messages[] = "La requête a protéger contient un nombre impair de caractère de protection '|'.";
77
	// TODO: delete wrappers, en attendant que $this->bdd soit remplacé par Cel::db() partout.
118
			$requete = false;
-
 
119
		}
-
 
120
		return $requete;
-
 
121
	}
-
 
122
 
78
	public function __get($prop) {
Line 123... Line 79...
123
	protected function proteger($chaine) {
79
		if($prop == 'bdd') return self::$bdd;
124
		return $this->bdd->quote($chaine);
80
		return $this->$prop;
125
	}
81
	}
126
 
82
 
127
	protected function protegerTableau(Array $tableau) {
83
	protected function protegerTableau(Array $tableau) {
128
		foreach ($tableau as $id => $val) {
84
		foreach ($tableau as $id => $val) {
Line 129... Line -...
129
			$tableau[$id] = $this->proteger($val);
-
 
130
		}
-
 
131
		return $tableau;
-
 
132
	}
-
 
133
 
-
 
134
	protected function executerRequeteSimple($requete) {
-
 
135
		$resultat = false;
-
 
136
		try {
-
 
137
			$resultat = $this->bdd->exec($requete);
-
 
138
			if ($resultat === false) {
-
 
139
				$this->debug[] = "La requête a échoué : $requete";
-
 
140
			}
-
 
141
		} catch (PDOException $e) {
-
 
142
			$this->debug[] = sprintf($this->getTxt('sql_erreur_requete'), $e->getFile(), $e->getLine(), $e->getMessage(), $requete);
-
 
143
		}
-
 
144
		return $resultat;
-
 
145
	}
-
 
146
 
-
 
147
	public function executerRequete($requete, $retour = self::SQL_RETOUR_COMPLET, $mode = PDO::FETCH_ASSOC) {
-
 
148
		$resultat = false;
-
 
149
		try {
-
 
150
			switch ($retour) {
-
 
151
				case self::SQL_RETOUR_COMPLET :
-
 
152
					$resultat = $this->bdd->query($requete)->fetchAll($mode);// Retourne toutes les lignes
-
 
153
					break;
-
 
154
				case self::SQL_RETOUR_LIGNE :
-
 
155
					$resultat = $this->bdd->query($requete)->fetch($mode);// Retourne la première ligne
-
 
156
					break;
-
 
157
				case self::SQL_RETOUR_COLONNE :
-
 
158
					$resultat = $this->bdd->query($requete)->fetchColumn();// Retourne la première colonne de la première ligne
-
 
159
					break;
-
 
160
				case self::SQL_RETOUR_BRUT :
-
 
161
					$resultat = $this->bdd->query($requete);// Retourne l'objet brut pour être utilisé dans une boucle de type foreach
-
 
162
					break;
-
 
163
				default:
-
 
164
					$this->debug[] = "Le type de retour '$retour' est inconnu.";
-
 
165
			}
-
 
166
			if ($resultat === false) {
-
 
167
				$this->debug[] = "La requête a retourné aucun résultat : $requete";
-
 
168
			}
-
 
169
		} catch (PDOException $e) {
-
 
170
			$this->debug[] = sprintf($this->getTxt('sql_erreur_requete'), $e->getFile(), $e->getLine(), $e->getMessage(), $requete);
-
 
171
		}
-
 
172
		return $resultat;
-
 
173
	}
-
 
174
 
-
 
175
	protected function getTxt($id) {
-
 
176
		$sortie = '';
-
 
177
		switch ($id) {
-
 
178
			case 'sql_erreur' : $sortie = 'Requête echec. Fichier : "%s". Ligne : "%s". Message : %s'; break;
-
 
179
			case 'sql_erreur_requete' : $sortie = "Requête echec.\nFichier : %s.\nLigne : %s.\nMessage : %s.\nRequête : %s"; break;
-
 
180
			default : $sortie = $id;
85
			$tableau[$id] = Cel::db()->proteger($val);
181
		}
86
		}
Line 182... Line 87...
182
		return $sortie;
87
		return $tableau;
183
	}
88
	}
Line 233... Line 138...
233
	protected function traiterParametres($params_attendu, $params, $pourBDD = true) {
138
	protected function traiterParametres($params_attendu, $params, $pourBDD = true) {
234
		$sortie = array();
139
		$sortie = array();
235
		foreach ($params_attendu as $num => $nom) {
140
		foreach ($params_attendu as $num => $nom) {
236
			if (isset($params[$num]) && $params[$num] != '*') {
141
			if (isset($params[$num]) && $params[$num] != '*') {
237
				if ($pourBDD) {
142
				if ($pourBDD) {
238
					$params[$num] = $this->bdd->quote($params[$num]);
143
					$params[$num] = self::$bdd->quote($params[$num]);
239
				}
144
				}
240
				$sortie[$nom] = $params[$num];
145
				$sortie[$nom] = $params[$num];
241
			}
146
			}
242
		}
147
		}
243
		return $sortie;
148
		return $sortie;
Line 457... Line 362...
457
		$infos_utilisateur = array('prenom' => $id_utilisateur, 'nom' => $id_utilisateur, 'courriel' => $id_utilisateur);
362
		$infos_utilisateur = array('prenom' => $id_utilisateur, 'nom' => $id_utilisateur, 'courriel' => $id_utilisateur);
Line 458... Line 363...
458
 
363
 
Line 459... Line 364...
459
		if(is_numeric($id_utilisateur)) {
364
		if(is_numeric($id_utilisateur)) {
460
 
365
 
Line 461... Line 366...
461
		$requete_infos_utilisateur = 'SELECT prenom, nom, courriel FROM cel_utilisateurs '.
366
		$requete_infos_utilisateur = 'SELECT prenom, nom, courriel FROM cel_utilisateurs '.
Line 462... Line 367...
462
									 'WHERE id_utilisateur = '.$this->proteger($id_utilisateur);
367
									 'WHERE id_utilisateur = '.Cel::db()->proteger($id_utilisateur);
463
 
368
 
464
		$resultat_infos_utilisateur = $this->requeter($requete_infos_utilisateur);
369
		$resultat_infos_utilisateur = Cel::db()->requeter($requete_infos_utilisateur);
465
 
370
 
Line 474... Line 379...
474
	public function getInfosComplementairesUtilisateurPourMail($mail_utilisateur) {
379
	public function getInfosComplementairesUtilisateurPourMail($mail_utilisateur) {
Line 475... Line 380...
475
 
380
 
Line 476... Line 381...
476
		$infos_utilisateur = array('prenom' => $mail_utilisateur, 'nom' => $mail_utilisateur, 'courriel' => $mail_utilisateur);
381
		$infos_utilisateur = array('prenom' => $mail_utilisateur, 'nom' => $mail_utilisateur, 'courriel' => $mail_utilisateur);
477
 
382
 
Line 478... Line 383...
478
		$requete_infos_utilisateur = 'SELECT id, prenom, nom FROM cel_utilisateurs '.
383
		$requete_infos_utilisateur = 'SELECT id, prenom, nom FROM cel_utilisateurs '.
Line 479... Line 384...
479
									 'WHERE courriel = '.$this->proteger($mail_utilisateur);
384
									 'WHERE courriel = '.Cel::db()->proteger($mail_utilisateur);
480
 
385
 
481
		$resultat_infos_utilisateur = $this->requeter($requete_infos_utilisateur);
386
		$resultat_infos_utilisateur = Cel::db()->requeter($requete_infos_utilisateur);
Line 647... Line 552...
647
	protected function obtenirCodeInseeCommunePourNomEtDepartement($nom_commune, $dpt) {
552
	protected function obtenirCodeInseeCommunePourNomEtDepartement($nom_commune, $dpt) {
Line 648... Line 553...
648
 
553
 
Line 649... Line 554...
649
		$code_insee = $dpt;
554
		$code_insee = $dpt;
650
 
555
 
651
		$requete = 'SELECT id_zone_geo FROM cel_zones_geo '.
556
		$requete = 'SELECT id_zone_geo FROM cel_zones_geo '.
Line 652... Line 557...
652
				   'WHERE nom LIKE '.$this->proteger($nom_commune).' '.
557
				   'WHERE nom LIKE '.Cel::db()->proteger($nom_commune).' '.
Line 653... Line 558...
653
				   'AND id_zone_geo LIKE "INSEE-C:'.$dpt.'%"';
558
				   'AND id_zone_geo LIKE "INSEE-C:'.$dpt.'%"';
654
 
559
 
655
		$resultat = $this->requeter($requete);
560
		$resultat = Cel::db()->requeter($requete);
Line 675... Line 580...
675
	}
580
	}
Line 676... Line 581...
676
 
581
 
677
	private function decoderMotsCles($utilisateur_id, $mots_cles, $type) {
582
	private function decoderMotsCles($utilisateur_id, $mots_cles, $type) {
678
		$mots = array();
583
		$mots = array();
679
		if (! $this->etreNull($mots_cles)) {
584
		if (! $this->etreNull($mots_cles)) {
Line 680... Line 585...
680
			$utilisateur_id = $this->bdd->quote($utilisateur_id);
585
			$utilisateur_id = self::$bdd->quote($utilisateur_id);
681
 
586
 
682
			$mots_cles = $this->protegerMotsCles($mots_cles, $type);
587
			$mots_cles = $this->protegerMotsCles($mots_cles, $type);
Line 683... Line 588...
683
			if (! $this->etreNull($mots_cles)) {
588
			if (! $this->etreNull($mots_cles)) {
684
				$table = ($type == self::TYPE_IMG) ? 'cel_mots_cles_images' : 'cel_mots_cles_obs' ;
589
				$table = ($type == self::TYPE_IMG) ? 'cel_mots_cles_images' : 'cel_mots_cles_obs' ;
685
 
590
 
686
				$requete = 'SELECT cmc_mot_cle as mot_cle '.
591
				$requete = 'SELECT cmc_mot_cle as mot_cle '.
Line 687... Line 592...
687
					"FROM $table ".
592
					"FROM $table ".
688
					"WHERE cmc_id_mot_cle_utilisateur IN ($mots_cles) ".
593
					"WHERE cmc_id_mot_cle_utilisateur IN ($mots_cles) ".
689
					"AND cmc_id_proprietaire = $utilisateur_id ";
594
					"AND cmc_id_proprietaire = $utilisateur_id ";
690
 
595
 
691
				$elements = $this->executerRequete($requete);
596
				$elements = Cel::db()->executerRequete($requete);
692
				if (is_array($elements)) {
597
				if (is_array($elements)) {
Line 707... Line 612...
707
 
612
 
708
	protected function traiterValeursMultiples($valeurs, $separateur_entree = ',' , $separateur_sortie = ',') {
613
	protected function traiterValeursMultiples($valeurs, $separateur_entree = ',' , $separateur_sortie = ',') {
709
		if (! $this->etreNull($valeurs)) {
614
		if (! $this->etreNull($valeurs)) {
710
			$valeurs_a_proteger = explode($separateur_entree,trim(trim($valeurs), $separateur_entree));
615
			$valeurs_a_proteger = explode($separateur_entree,trim(trim($valeurs), $separateur_entree));
711
			foreach ($valeurs_a_proteger as $valeur) {
616
			foreach ($valeurs_a_proteger as $valeur) {
712
				$valeurs_protegees[] = $this->bdd->quote($valeur);
617
				$valeurs_protegees[] = self::$bdd->quote($valeur);
713
			}
618
			}
714
			$valeurs = implode($separateur_sortie, $valeurs_protegees);
619
			$valeurs = implode($separateur_sortie, $valeurs_protegees);
715
		}
620
		}
716
		return ($this->etreNull($valeurs)) ? null : $valeurs;
621
		return ($this->etreNull($valeurs)) ? null : $valeurs;