Subversion Repositories Applications.referentiel

Rev

Rev 141 | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 141 Rev 191
1
<?php
1
<?php
2
/**
2
/**
3
 * Classe mère abstraite contenant les méthodes génériques des services des Référentiels.
3
 * Classe mère abstraite contenant les méthodes génériques des services des Référentiels.
4
 * Encodage en entrée : utf8
4
 * Encodage en entrée : utf8
5
 * Encodage en sortie : utf8
5
 * Encodage en sortie : utf8
6
 * 
6
 * 
7
 * @category	Php 5.2
7
 * @category	Php 5.2
8
 * @package		Referentiel
8
 * @package		Referentiel
9
 * @author		Jean-Pascal MILCENT <jpm@tela-botanica.org>
9
 * @author		Jean-Pascal MILCENT <jpm@tela-botanica.org>
10
 * @license		GPL v3 <http://www.gnu.org/licenses/gpl.txt>
10
 * @license		GPL v3 <http://www.gnu.org/licenses/gpl.txt>
11
 * @license		CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
11
 * @license		CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
12
 * @copyright	2010 Tela-Botanica
12
 * @copyright	2010 Tela-Botanica
13
 * @version		$Id$
13
 * @version		$Id$
14
 */
14
 */
15
abstract class Ref {
15
abstract class Ref {
16
	
16
	
17
	public $config;
17
	public $config;
18
	protected $bdd;
18
	protected $bdd;
19
	protected $messages = array();
19
	protected $messages = array();
20
	protected $debug = array();
20
	protected $debug = array();
21
	protected $distinct = false;
21
	protected $distinct = false;
22
	protected $orderby = null;
22
	protected $orderby = null;
23
	protected $formatRetour = 'objet';
23
	protected $formatRetour = 'objet';
24
	protected $start = 0; 
24
	protected $start = 0;
25
	protected $limit = 150;
25
	protected $limit = 150;
26
	
26
	
27
	public function __construct($config, $demarrer_session = true) {
27
	public function __construct($config, $demarrer_session = true) {
28
		// Tableau contenant la config de Jrest
28
		// Tableau contenant la config de Jrest
29
		$this->config = $config;
29
		$this->config = $config;
30
		
30
		
31
		// Connection à la base de données
31
		// Connection à la base de données
32
		$this->bdd = $this->connecterPDO($this->config, 'database');
32
		$this->bdd = $this->connecterPDO($this->config, 'database');
33
		
33
		
34
		// Nettoyage du $_GET (sécurité)
34
		// Nettoyage du $_GET (sécurité)
35
		if (isset($_GET)) {
35
		if (isset($_GET)) {
36
			$get_params = array('orderby', 'distinct', 'start', 'limit', 'formatRetour');
36
			$get_params = array('orderby', 'distinct', 'start', 'limit', 'formatRetour');
37
			foreach ($get_params as $get) {
37
			foreach ($get_params as $get) {
38
				if (isset($_GET[$get])) {
38
				if (isset($_GET[$get])) {
39
					$verifier = array('NULL', "\n", "\r", "\\", "'", '"', "\x00", "\x1a", ';');
39
					$verifier = array('NULL', "\n", "\r", "\\", "'", '"', "\x00", "\x1a", ';');
40
					$_GET[$get] = strip_tags(str_replace($verifier, '', $_GET[$get]));
40
					$_GET[$get] = strip_tags(str_replace($verifier, '', $_GET[$get]));
41
					if ($_GET[$get] != '') {
41
					if ($_GET[$get] != '') {
42
						$this->$get = $_GET[$get];
42
						$this->$get = $_GET[$get];
43
					} else {
43
					} else {
44
						$_GET[$get] = null;
44
						$_GET[$get] = null;
45
					}
45
					}
46
				}
46
				}
47
			}
47
			}
48
		}
48
		}
49
	}
49
	}
50
 
50
 
51
	/**
51
	/**
52
	 * Méthode appelée quand aucun paramètre n'est passé dans l'url et avec une requête de type GET.
52
	 * Méthode appelée quand aucun paramètre n'est passé dans l'url et avec une requête de type GET.
53
	 */
53
	 */
54
	public function getRessource() {
54
	public function getRessource() {
55
		$this->getElement(array());
55
		$this->getElement(array());
56
	}
56
	}
57
	
57
	
58
	protected function envoyer($donnees = null, $mime = 'text/html', $encodage = 'utf-8', $json = true) {
58
	protected function envoyer($donnees = null, $mime = 'text/html', $encodage = 'utf-8', $json = true) {
59
		// Traitements des messages d'erreurs et données
59
		// Traitements des messages d'erreurs et données
60
		if (count($this->messages) != 0) {
60
		if (count($this->messages) != 0) {
61
			header('HTTP/1.1 424 Method failure');
61
			header('HTTP/1.1 424 Method failure');
62
			$sortie = $this->messages;
62
			$sortie = $this->messages;
63
			// En plus de la réponse, nous passons les messages dans l'entete car la réponse ne peut pas être récupérée
63
			// En plus de la réponse, nous passons les messages dans l'entete car la réponse ne peut pas être récupérée
64
			// avec ce type d'erreur HTTP en php..
64
			// avec ce type d'erreur HTTP en php..
65
			// FIXME : comment récupérer en php le contenu de la réponse portant le code HTTP 424 ou 500
65
			// FIXME : comment récupérer en php le contenu de la réponse portant le code HTTP 424 ou 500
66
			$this->envoyerEnteteMessage();
66
			$this->envoyerEnteteMessage();
67
		} else {
67
		} else {
68
			$sortie = $donnees;
68
			$sortie = $donnees;
69
		}
69
		}
70
 
70
 
71
		// Gestion de l'envoie du déboguage
71
		// Gestion de l'envoie du déboguage
72
		$this->envoyerEnteteDebogage();
72
		$this->envoyerEnteteDebogage();
73
		
73
		
74
		// Encodage au format et JSON et envoie sur la sortie standard
74
		// Encodage au format et JSON et envoie sur la sortie standard
75
		$contenu = $json ? json_encode($sortie) : $sortie;
75
		$contenu = $json ? json_encode($sortie) : $sortie;
76
		$mime = $json ? 'application/json' : $mime;
76
		$mime = $json ? 'application/json' : $mime;
77
		$this->envoyerContenu($encodage, $mime, $contenu);
77
		$this->envoyerContenu($encodage, $mime, $contenu);
78
	}
78
	}
79
	
79
	
80
	protected function envoyerEnteteMessage() {
80
	protected function envoyerEnteteMessage() {
81
		if (!is_array($this->messages)) {
81
		if (!is_array($this->messages)) {
82
			$this->messages[] = $this->messages;
82
			$this->messages[] = $this->messages;
83
		}
83
		}
84
		if (count($this->messages) != 0) {
84
		if (count($this->messages) != 0) {
85
			foreach ($this->messages as $cle => $val) {
85
			foreach ($this->messages as $cle => $val) {
86
				if (is_array($val)) {
86
				if (is_array($val)) {
87
					$this->messages[$cle] = print_r($val, true);
87
					$this->messages[$cle] = print_r($val, true);
88
				}
88
				}
89
			}
89
			}
90
			header('X-MessageJrest-Data: '.json_encode($this->messages));
90
			header('X-MessageJrest-Data: '.json_encode($this->messages));
91
		}
91
		}
92
	}
92
	}
93
	
93
	
94
	protected function envoyerEnteteDebogage() {
94
	protected function envoyerEnteteDebogage() {
95
		if (!is_array($this->debug)) {
95
		if (!is_array($this->debug)) {
96
			$this->debug[] = $this->debug;
96
			$this->debug[] = $this->debug;
97
		}
97
		}
98
		if (count($this->debug) != 0) {
98
		if (count($this->debug) != 0) {
99
			foreach ($this->debug as $cle => $val) {
99
			foreach ($this->debug as $cle => $val) {
100
				if (is_array($val)) {
100
				if (is_array($val)) {
101
					$this->debug[$cle] = print_r($val, true);
101
					$this->debug[$cle] = print_r($val, true);
102
				}
102
				}
103
			}
103
			}
104
			header('X-DebugJrest-Data: '.json_encode($this->debug));
104
			header('X-DebugJrest-Data: '.json_encode($this->debug));
105
		}
105
		}
106
	}
106
	}
107
	
107
	
108
	protected function envoyerContenu($encodage, $mime, $contenu) {
108
	protected function envoyerContenu($encodage, $mime, $contenu) {
109
		header("Content-Type: $mime; charset=$encodage");
109
		header("Content-Type: $mime; charset=$encodage");
110
		print $contenu;
110
		print $contenu;
111
	}
111
	}
112
	
112
	
113
	private function connecterPDO($config, $base = 'database') {
113
	private function connecterPDO($config, $base = 'database') {
114
        $cfg = $config[$base];
114
        $cfg = $config[$base];
115
		$dsn = $cfg['phptype'].':dbname='.$cfg['database'].';host='.$cfg['hostspec'];
115
		$dsn = $cfg['phptype'].':dbname='.$cfg['database'].';host='.$cfg['hostspec'];
116
		try {
116
		try {
117
    		$PDO = new PDO($dsn, $cfg['username'], $cfg['password']);
117
    		$PDO = new PDO($dsn, $cfg['username'], $cfg['password']);
118
		} catch (PDOException $e) {
118
		} catch (PDOException $e) {
119
    		echo 'La connexion à la base de donnée via PDO a échouée : ' . $e->getMessage();
119
    		echo 'La connexion à la base de donnée via PDO a échouée : ' . $e->getMessage();
120
		}
120
		}
121
		// Passe en UTF-8 la connexion à la BDD
121
		// Passe en UTF-8 la connexion à la BDD
122
		$PDO->exec("SET NAMES 'utf8'");
122
		$PDO->exec("SET NAMES 'utf8'");
123
		// Affiche les erreurs détectées par PDO (sinon mode silencieux => aucune erreur affiché)
123
		// Affiche les erreurs détectées par PDO (sinon mode silencieux => aucune erreur affiché)
124
		$PDO->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
124
		$PDO->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
125
        return $PDO;
125
        return $PDO;
126
	}
126
	}
127
	
127
	
128
	protected function executerRequete($requete, $message_echec) {
128
	protected function executerRequete($requete, $message_echec) {
129
		try {
129
		try {
130
			$infos = $this->bdd->query($requete)->fetchAll(PDO::FETCH_ASSOC);
130
			$infos = $this->bdd->query($requete)->fetchAll(PDO::FETCH_ASSOC);
131
			if ($infos === false) {
131
			if ($infos === false) {
132
				$this->messages[] = $message_echec;
132
				$this->messages[] = $message_echec;
133
			}
133
			}
134
		} catch (PDOException $e) {
134
		} catch (PDOException $e) {
135
			$this->messages[] = sprintf($this->getTxt('sql_erreur_requete'), $e->getFile(), $e->getLine(), $e->getMessage(), $requete);
135
			$this->messages[] = sprintf($this->getTxt('sql_erreur_requete'), $e->getFile(), $e->getLine(), $e->getMessage(), $requete);
136
		}
136
		}
137
		return $infos;
137
		return $infos;
138
	}
138
	}
139
	
139
	
140
	protected function getTxt($id) {
140
	protected function getTxt($id) {
141
		$sortie = '';
141
		$sortie = '';
142
		switch ($id) {
142
		switch ($id) {
143
			case 'sql_erreur' : $sortie = 'Requête echec. Fichier : "%s". Ligne : "%s". Message : %s'; break;
143
			case 'sql_erreur' : $sortie = 'Requête echec. Fichier : "%s". Ligne : "%s". Message : %s'; break;
144
			case 'sql_erreur_requete' : $sortie = "Requête echec.\nFichier : %s.\nLigne : %s.\nMessage : %s.\nRequête : %s"; break;
144
			case 'sql_erreur_requete' : $sortie = "Requête echec.\nFichier : %s.\nLigne : %s.\nMessage : %s.\nRequête : %s"; break;
145
			default : $sortie = $id; 
145
			default : $sortie = $id; 
146
		}
146
		}
147
		return $sortie;
147
		return $sortie;
148
	}
148
	}
149
	
149
	
150
	protected function traiterParametresUrl($params_attendu, $params, $pourBDD = true) {
150
	protected function traiterParametresUrl($params_attendu, $params, $pourBDD = true) {
151
		$sortie = array();
151
		$sortie = array();
152
		foreach ($params_attendu as $num => $nom) {
152
		foreach ($params_attendu as $num => $nom) {
153
			if (isset($params[$num]) && $params[$num] != '*') {
153
			if (isset($params[$num]) && $params[$num] != '*') {
154
				if ($pourBDD) {
154
				if ($pourBDD) {
155
					$params[$num] = $this->bdd->quote($params[$num]);
155
					$params[$num] = $this->bdd->quote($params[$num]);
156
				}
156
				}
157
				$sortie[$nom] = $params[$num];
157
				$sortie[$nom] = $params[$num];
158
			}
158
			}
159
		}
159
		}
160
		return $sortie;
160
		return $sortie;
161
	}
161
	}
162
	
162
	
163
	protected function traiterParametresPost($params_attendu, $params, $pourBDD = true) {
163
	protected function traiterParametresPost($params_attendu, $params, $pourBDD = true) {
164
		$sortie = array();
164
		$sortie = array();
165
		foreach ($params_attendu as $num => $nom) {
165
		foreach ($params_attendu as $num => $nom) {
166
			if (isset($params[$nom]) && $params[$nom] != '') {
166
			if (isset($params[$nom]) && $params[$nom] != '') {
167
				if ($pourBDD) {
167
				if ($pourBDD) {
168
					$params[$nom] = $this->bdd->quote($params[$nom]);
168
					$params[$nom] = $this->bdd->quote($params[$nom]);
169
				}
169
				}
170
				$sortie[$nom] = $params[$nom];
170
				$sortie[$nom] = $params[$nom];
171
			} else {
171
			} else {
172
				if ($pourBDD) {
172
				if ($pourBDD) {
173
					$sortie[$nom] = 'NULL';
173
					$sortie[$nom] = 'NULL';
174
				} else {
174
				} else {
175
					$sortie[$nom] = '';
175
					$sortie[$nom] = '';
176
				}
176
				}
177
			}
177
			}
178
		}
178
		}
179
		return $sortie;
179
		return $sortie;
180
	}
180
	}
181
	
181
	
182
	protected function traiterBddClauseIn($chaine) {
182
	protected function traiterBddClauseIn($chaine) {
183
		$sortie = '';
183
		$sortie = '';
184
		$chaine = trim($chaine, " '");
184
		$chaine = trim($chaine, " '");
185
		if ($chaine != '') {
185
		if ($chaine != '') {
186
			$valeurs = explode(',', $chaine);
186
			$valeurs = explode(',', $chaine);
187
			foreach ($valeurs as $id => $valeur) {
187
			foreach ($valeurs as $id => $valeur) {
188
				$valeurs[$id] = $this->bdd->quote($valeur);
188
				$valeurs[$id] = $this->bdd->quote($valeur);
189
			}
189
			}
190
			$sortie = implode(',', $valeurs);
190
			$sortie = implode(',', $valeurs);
191
		}
191
		}
192
		return $sortie;
192
		return $sortie;
193
	}
193
	}
194
}
194
}
195
?>
195
?>