| 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;
|