Subversion Repositories Applications.referentiel

Rev

Rev 26 | Rev 39 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 26 Rev 38
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
				$verifier = array('NULL', "\n", "\r", "\\", "'", '"', "\x00", "\x1a", ';');
39
					$verifier = array('NULL', "\n", "\r", "\\", "'", '"', "\x00", "\x1a", ';');
39
				$_GET[$get] = str_replace($verifier, '', $_GET[$get]);
40
					$_GET[$get] = strip_tags(str_replace($verifier, '', $_GET[$get]));
40
				if (isset($_GET[$get]) && $_GET[$get] != '') {
41
					if ($_GET[$get] != '') {
41
					$this->$get = $_GET[$get];
42
						$this->$get = $_GET[$get];
42
				} else {
43
					} else {
43
					$_GET[$get] = null;
44
						$_GET[$get] = null;
-
 
45
					}
44
				}
46
				}
45
			}
47
			}
46
		}
48
		}
47
	}
49
	}
48
 
50
 
49
	/**
51
	/**
50
	 * 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.
51
	 */
53
	 */
52
	public function getRessource() {
54
	public function getRessource() {
53
		$this->getElement(array());
55
		$this->getElement(array());
54
	}
56
	}
55
	
57
	
56
	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) {
57
		// Traitements des messages d'erreurs et données
59
		// Traitements des messages d'erreurs et données
58
		if (count($this->messages) != 0) {
60
		if (count($this->messages) != 0) {
59
			header('HTTP/1.1 424 Method failure');
61
			header('HTTP/1.1 424 Method failure');
60
			$mime = 'text/html';
62
			$mime = 'text/html';
61
			$encodage = 'utf-8';
63
			$encodage = 'utf-8';
62
			$sortie = $this->messages;
64
			$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
65
			// 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..
66
			// 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
67
			// FIXME : comment récupérer en php le contenu de la réponse portant le code HTTP 424 ou 500
66
			$this->envoyerEnteteMessage();
68
			$this->envoyerEnteteMessage();
67
		} else {
69
		} else {
68
			$sortie = $donnees;
70
			$sortie = $donnees;
69
			if (is_null($donnees)) {
71
			if (is_null($donnees)) {
70
				$sortie = 'OK';
72
				$sortie = 'OK';
71
			}
73
			}
72
		}
74
		}
73
 
75
 
74
		// Gestion de l'envoie du déboguage
76
		// Gestion de l'envoie du déboguage
75
		$this->envoyerEnteteDebogage();
77
		$this->envoyerEnteteDebogage();
76
		
78
		
77
		// Encodage au format et JSON et envoie sur la sortie standard
79
		// Encodage au format et JSON et envoie sur la sortie standard
78
		$contenu = $json ? json_encode($sortie) : $sortie;
80
		$contenu = $json ? json_encode($sortie) : $sortie;
79
		$this->envoyerContenu($encodage, $mime, $contenu);
81
		$this->envoyerContenu($encodage, $mime, $contenu);
80
	}
82
	}
81
	
83
	
82
	protected function envoyerEnteteMessage() {
84
	protected function envoyerEnteteMessage() {
83
		if (!is_array($this->messages)) {
85
		if (!is_array($this->messages)) {
84
			$this->messages[] = $this->messages;
86
			$this->messages[] = $this->messages;
85
		}
87
		}
86
		if (count($this->messages) != 0) {
88
		if (count($this->messages) != 0) {
87
			foreach ($this->messages as $cle => $val) {
89
			foreach ($this->messages as $cle => $val) {
88
				if (is_array($val)) {
90
				if (is_array($val)) {
89
					$this->messages[$cle] = print_r($val, true);
91
					$this->messages[$cle] = print_r($val, true);
90
				}
92
				}
91
			}
93
			}
92
			header('X-MessageJrest-Data: '.json_encode($this->messages));
94
			header('X-MessageJrest-Data: '.json_encode($this->messages));
93
		}
95
		}
94
	}
96
	}
95
	
97
	
96
	protected function envoyerEnteteDebogage() {
98
	protected function envoyerEnteteDebogage() {
97
		if (!is_array($this->debug)) {
99
		if (!is_array($this->debug)) {
98
			$this->debug[] = $this->debug;
100
			$this->debug[] = $this->debug;
99
		}
101
		}
100
		if (count($this->debug) != 0) {
102
		if (count($this->debug) != 0) {
101
			foreach ($this->debug as $cle => $val) {
103
			foreach ($this->debug as $cle => $val) {
102
				if (is_array($val)) {
104
				if (is_array($val)) {
103
					$this->debug[$cle] = print_r($val, true);
105
					$this->debug[$cle] = print_r($val, true);
104
				}
106
				}
105
			}
107
			}
106
			header('X-DebugJrest-Data: '.json_encode($this->debug));
108
			header('X-DebugJrest-Data: '.json_encode($this->debug));
107
		}
109
		}
108
	}
110
	}
109
	
111
	
110
	protected function envoyerContenu($encodage, $mime, $contenu) {
112
	protected function envoyerContenu($encodage, $mime, $contenu) {
111
		header("Content-Type: $mime; charset=$encodage");
113
		header("Content-Type: $mime; charset=$encodage");
112
		print $contenu;
114
		print $contenu;
113
	}
115
	}
114
	
116
	
115
	private function connecterPDO($config, $base = 'database') {
117
	private function connecterPDO($config, $base = 'database') {
116
        $cfg = $config[$base];
118
        $cfg = $config[$base];
117
		$dsn = $cfg['phptype'].':dbname='.$cfg['database'].';host='.$cfg['hostspec'];
119
		$dsn = $cfg['phptype'].':dbname='.$cfg['database'].';host='.$cfg['hostspec'];
118
		try {
120
		try {
119
    		$PDO = new PDO($dsn, $cfg['username'], $cfg['password']);
121
    		$PDO = new PDO($dsn, $cfg['username'], $cfg['password']);
120
		} catch (PDOException $e) {
122
		} catch (PDOException $e) {
121
    		echo 'La connexion à la base de donnée via PDO a échouée : ' . $e->getMessage();
123
    		echo 'La connexion à la base de donnée via PDO a échouée : ' . $e->getMessage();
122
		}
124
		}
123
		// Passe en UTF-8 la connexion à la BDD
125
		// Passe en UTF-8 la connexion à la BDD
124
		$PDO->exec("SET NAMES 'utf8'");
126
		$PDO->exec("SET NAMES 'utf8'");
125
		// Affiche les erreurs détectées par PDO (sinon mode silencieux => aucune erreur affiché)
127
		// Affiche les erreurs détectées par PDO (sinon mode silencieux => aucune erreur affiché)
126
		$PDO->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
128
		$PDO->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
127
        return $PDO;
129
        return $PDO;
128
	}
130
	}
129
	
131
	
130
	protected function getTxt($id) {
132
	protected function getTxt($id) {
131
		$sortie = '';
133
		$sortie = '';
132
		switch ($id) {
134
		switch ($id) {
133
			case 'sql_erreur' : $sortie = 'Requête echec. Fichier : "%s". Ligne : "%s". Message : %s'; break;
135
			case 'sql_erreur' : $sortie = 'Requête echec. Fichier : "%s". Ligne : "%s". Message : %s'; break;
134
			default : $sortie = $id; 
136
			default : $sortie = $id; 
135
		}
137
		}
136
		return $sortie;
138
		return $sortie;
137
	}
139
	}
138
	
140
	
139
	protected function traiterParametresUrl($params_attendu, $params, $pourBDD = true) {
141
	protected function traiterParametresUrl($params_attendu, $params, $pourBDD = true) {
140
		$sortie = array();
142
		$sortie = array();
141
		foreach ($params_attendu as $num => $nom) {
143
		foreach ($params_attendu as $num => $nom) {
142
			if (isset($params[$num]) && $params[$num] != '*') {
144
			if (isset($params[$num]) && $params[$num] != '*') {
143
				if ($pourBDD) {
145
				if ($pourBDD) {
144
					$params[$num] = $this->bdd->quote($params[$num]);
146
					$params[$num] = $this->bdd->quote($params[$num]);
145
				}
147
				}
146
				$sortie[$nom] = $params[$num];
148
				$sortie[$nom] = $params[$num];
147
			}
149
			}
148
		}
150
		}
149
		return $sortie;
151
		return $sortie;
150
	}
152
	}
151
	
153
	
152
	protected function traiterParametresPost($params_attendu, $params, $pourBDD = true) {
154
	protected function traiterParametresPost($params_attendu, $params, $pourBDD = true) {
153
		$sortie = array();
155
		$sortie = array();
154
		foreach ($params_attendu as $num => $nom) {
156
		foreach ($params_attendu as $num => $nom) {
155
			if (isset($params[$nom]) && $params[$nom] != '') {
157
			if (isset($params[$nom]) && $params[$nom] != '') {
156
				if ($pourBDD) {
158
				if ($pourBDD) {
157
					$params[$nom] = $this->bdd->quote($params[$nom]);
159
					$params[$nom] = $this->bdd->quote($params[$nom]);
158
				}
160
				}
159
				$sortie[$nom] = $params[$nom];
161
				$sortie[$nom] = $params[$nom];
160
			} else {
162
			} else {
161
				if ($pourBDD) {
163
				if ($pourBDD) {
162
					$sortie[$nom] = 'NULL';
164
					$sortie[$nom] = 'NULL';
163
				} else {
165
				} else {
164
					$sortie[$nom] = '';
166
					$sortie[$nom] = '';
165
				}
167
				}
166
			}
168
			}
167
		}
169
		}
168
		return $sortie;
170
		return $sortie;
169
	}
171
	}
170
	
172
	
171
	protected function traiterBddClauseIn($chaine) {
173
	protected function traiterBddClauseIn($chaine) {
172
		$sortie = '';
174
		$sortie = '';
173
		$chaine = trim($chaine, " '");
175
		$chaine = trim($chaine, " '");
174
		if ($chaine != '') {
176
		if ($chaine != '') {
175
			$valeurs = explode(',', $chaine);
177
			$valeurs = explode(',', $chaine);
176
			foreach ($valeurs as $id => $valeur) {
178
			foreach ($valeurs as $id => $valeur) {
177
				$valeurs[$id] = $this->bdd->quote($valeur);
179
				$valeurs[$id] = $this->bdd->quote($valeur);
178
			}
180
			}
179
			$sortie = implode(',', $valeurs);
181
			$sortie = implode(',', $valeurs);
180
		}
182
		}
181
		return $sortie;
183
		return $sortie;
182
	}
184
	}
183
}
185
}
184
?>
186
?>