Subversion Repositories Applications.framework

Rev

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

Rev 231 Rev 238
Line 1... Line 1...
1
<?php
1
<?php
2
// declare(encoding='UTF-8');
2
// declare(encoding='UTF-8');
3
/**
3
/**
4
* Classe modèle, d'accés au données, elle ne devrait pas être appelée de l'extérieur.
4
 * Classe Bdd, d'accés au base de données.
5
* Elle fait office d'abstraction légère de base de données en utilisant diverses possibilités
5
 * Elle fait office d'abstraction légère de base de données en utilisant diverses possibilités d'accès aux 
6
* d'abstraction de base de données (PDO, mysql, mysqli, SQLite3).
6
 * bases de données (PDO, mysql, mysqli, SQLite3).
7
* Les valeurs pour le paramètre 'bdd_abstraction' du fichier config.ini sont : pdo, mysql, mysqli, sqlite3
7
 * Les valeurs pour le paramètre 'bdd_abstraction' du fichier config.ini sont : pdo, mysql, mysqli, sqlite3
-
 
8
 * Vous pouvez aussi utiliser : "php:Bdd::ABSTRACTION_PDO","php:Bdd::ABSTRACTION_MYSQL", "php:Bdd::ABSTRACTION_MYSQLI",
-
 
9
 * "php:Bdd::ABSTRACTION_SQLITE3".
8
* Elle est abstraite et doit donc obligatoirement être étendue.
10
 * Elle peut être étendue, pour ajouter le support d'autres bases de données où prendre en compte des méthodes spécifique à
-
 
11
 * un type d'abstraction.
9
*
12
 *
10
* @category	php 5.2
13
 * @category	php 5.2
11
* @package		Framework
14
 * @package	Framework
12
* @author		Aurélien PERONNET <aurelien@tela-botanica.org>
15
 * @author		Aurélien PERONNET <aurelien@tela-botanica.org>
-
 
16
 * @author		Jean-Pascal MILCENT <jpm@tela-botanica.org>
13
* @copyright	2009 Tela-Botanica
17
 * @copyright	Copyright (c) 2009, Tela Botanica (accueil@tela-botanica.org)
14
* @license		http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
18
 * @license	http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
15
* @license		http://www.gnu.org/licenses/gpl.html Licence GNU-GPL
19
 * @license	http://www.gnu.org/licenses/gpl.html Licence GNU-GPL
16
* @version		SVN: $Id: Modele.php 231 2010-11-17 10:02:53Z delphine $
20
 * @version	$Id: Bdd.php 238 2010-11-24 17:53:29Z jpm $
17
* @link		/doc/framework/
21
 * @link		/doc/framework/
18
*
-
 
19
*/
22
 */
20
abstract class Modele {
23
class Bdd {
21
	/** Constante stockant le squelette du message en cas d'erreur de requête sql. */
24
	/** Constante stockant le squelette du message en cas d'erreur de requête sql. */
22
	const ERREUR_REQUETE_TPL = 'Requête echec.\nFichier : %s.\nLigne : %s.\nMessage : %s.\nRequête : %s';
25
	const ERREUR_REQUETE_TPL = 'Requête echec.\nFichier : %s.\nLigne : %s.\nMessage : %s.\nRequête : %s';
Line 23... Line 26...
23
	
26
	
24
	/** Constante stockant le squelette du message en cas d'erreur de connexion à la base de données. */
27
	/** Constante stockant le squelette du message en cas d'erreur de connexion à la base de données. */
Line 44... Line 47...
44
	
47
	
45
	/** Constante stockant le code pour le mode objet des résultats des requêtes. */
48
	/** Constante stockant le code pour le mode objet des résultats des requêtes. */
Line 46... Line 49...
46
	const MODE_OBJET = 'OBJECT';
49
	const MODE_OBJET = 'OBJECT';
47
	
50
	
Line 48... Line 51...
48
	/** Mode de fetch associatif */
51
	/** Mode de fetch associatif */
49
	private $ASSOC = '';
52
	protected $ASSOC = '';
Line 50... Line 53...
50
	
53
	
51
	/** Mode de fetch objet */
54
	/** Mode de fetch objet */
Line 52... Line 55...
52
	private $OBJECT = '';
55
	protected $OBJECT = '';
53
 
56
 
Line 54... Line 57...
54
	/** abstraction de base de données utilisée */
57
	/** abstraction de base de données utilisée */
55
	private $abstraction;
58
	protected $abstraction;
Line 56... Line 59...
56
	
59
	
57
	/** DSN pour accéder à la base de données */
60
	/** DSN pour accéder à la base de données */
Line 58... Line 61...
58
	private $dsn;
61
	protected $dsn;
59
	
62
	
Line 60... Line 63...
60
	/** Type de base de données (mysql, mysqli, etc ...) */
63
	/** Type de base de données (mysql, mysqli, etc ...) */
61
	private $type;
64
	protected $type;
Line 62... Line 65...
62
	
65
	
63
	/** Hote herbergeant la base de données */
66
	/** Hote herbergeant la base de données */
Line 64... Line 67...
64
	private $hote;
67
	protected $hote;
65
	
68
	
Line 66... Line 69...
66
	/** Nom de la base de données à laquelle le modèle doit se connecter */
69
	/** Nom de la base de données à laquelle le modèle doit se connecter */
67
	private $bdd_nom;
70
	protected $bdd_nom;
Line -... Line 71...
-
 
71
	
-
 
72
	/** Nom d'utilisateur */
68
	
73
	protected $utilisateur;
69
	/** Nom d'utilisateur */
74
	
70
	private $utilisateur;
-
 
71
	
75
	/** Mot de passe */
-
 
76
	protected $pass;
72
	/** Mot de passe */
77
 
73
	private $pass;
78
	/** Encodage de la base de données */
74
 
79
	protected $encodage = null;
75
	/** Encodage de la base de données */
80
	
76
	 private $encodage = null;
81
	/** Connexion à la base de données */
Line 92... Line 97...
92
 
97
 
93
		$this->dsn = $this->type.':dbname='.$this->bdd_nom.';host='.$this->hote;
98
		$this->dsn = $this->type.':dbname='.$this->bdd_nom.';host='.$this->hote;
94
		$this->initialiserProtocole();
99
		$this->initialiserProtocole();
Line 95... Line -...
95
	}
-
 
96
 
100
	}
97
	/**
-
 
98
	 * Connection à la base de données en utilisant les informations fournies par
-
 
99
	 * le fichier de configuration.
-
 
100
	 * private et final car n'a pas vocation a être appelée par l'utilisateur.
-
 
101
	 *
-
 
102
	 * @throws Exception une exception dans le cas ou là connexion échoue
101
 
103
	 */
102
	/** Initialise les constantes de classe à leur bonne valeur et déclenche une erreur si le protocole n'est pas bien défini. */
104
	final private function connecter() {
103
	protected function initialiserProtocole() {
105
		switch ($this->abstraction) {
-
 
106
			case self::ABSTRACTION_PDO :
-
 
107
				try {
104
		switch ($this->abstraction) {
108
					$this->connexion = new PDO($this->dsn, $this->utilisateur, $this->pass);
-
 
109
				} catch (PDOException $e) {
105
			case self::ABSTRACTION_PDO :
110
					$e = sprintf(self::ERREUR_CONNEXION_TPL, $e->getMessage());
-
 
111
					trigger_error($e, E_USER_WARNING);
106
				$this->ASSOC = PDO::FETCH_ASSOC;
112
				}
107
				$this->OBJECT = PDO::FETCH_CLASS;
113
				break;
-
 
114
			case self::ABSTRACTION_MYSQL :
108
				break;
115
				$this->connexion = mysql_connect($this->hote, $this->utilisateur, $this->pass);
-
 
116
				if ($this->connexion !== false) {
-
 
117
					$selection = mysql_select_db($this->bdd_nom, $this->connexion);
-
 
118
					if ($selection === false) {
-
 
119
						$e = sprintf(self::ERREUR_SELECTION_BDD_TPL, mysql_error());
-
 
120
						trigger_error($e, E_USER_WARNING);
-
 
121
					}
-
 
122
				} else {
109
			case self::ABSTRACTION_MYSQL :
123
					$e = sprintf(self::ERREUR_CONNEXION_TPL, mysql_error());
-
 
124
					trigger_error($e, E_USER_WARNING);
110
				$this->ASSOC = 'mysql_fetch_assoc';
125
				}
111
				$this->OBJECT = 'mysql_fetch_object';
126
				break;
-
 
127
			case self::ABSTRACTION_MYSQLI :
112
				break;
128
				$this->connexion = @new mysqli($this->hote, $this->utilisateur, $this->pass, $this->bdd_nom);
-
 
129
				if ($this->connexion->connect_errno) {
113
			case self::ABSTRACTION_MYSQLI :
130
					$e = sprintf(self::ERREUR_CONNEXION_TPL, $this->connexion->connect_error);
-
 
131
					trigger_error($e, E_USER_WARNING);
114
				$this->ASSOC = 'fetch_assoc';
132
				}
115
				$this->OBJECT = 'fetch_object';
133
				break;
-
 
134
			case self::ABSTRACTION_SQLITE3 :
116
				break;
135
				// cas particulier de sqllite, on considère que le nom de la base de données correspond au fichier à ouvrir
-
 
136
				$this->connexion = new SQLite3($this->bdd_nom);
-
 
137
				if (!$this->connexion) {
117
			case self::ABSTRACTION_SQLITE3 :
138
					$e = sprintf(self::ERREUR_CONNEXION_TPL, '');
-
 
139
					trigger_error($e, E_USER_WARNING);
118
				$this->ASSOC = 'SQLITE3_ASSOC';
140
				}
119
				$this->OBJECT = 'SQLITE3_OBJECT';
141
				break;
120
				break;
142
			default:
-
 
143
				$this->connexion = null;
-
 
144
		}
-
 
145
 
121
			default:
146
		if ($this->encodage != null) {
122
				$m = "Erreur : l'abstraction '{$this->abstraction}' n'est pas prise en charge";
147
			$this->requete("SET names '".$this->encodage."'");
123
				trigger_error($m, E_USER_WARNING);
148
		}
124
		}
149
	}
125
	}
150
 
126
	
151
	/**
-
 
152
	 * Fonction qui appelle la bonne fonction pour executer une requête suivant le type de bdd.
127
	/**
153
	 *
128
	 * Connection à la base de données en utilisant les informations fournies par
154
	 * @param string la requete à effectuer
129
	 * le fichier de configuration.
155
	 * @return PDOStatement un objet contenant le résultat de la requête
130
	 * Cette méthode est private et final car elle n'a pas vocation a être appelée par l'utilisateur.
156
	 */
131
	 */
-
 
132
	protected function connecter() {
-
 
133
		if ($this->connexion == null) {
-
 
134
			switch ($this->abstraction) {
-
 
135
				case self::ABSTRACTION_PDO :
-
 
136
					try {
-
 
137
						$this->connexion = new PDO($this->dsn, $this->utilisateur, $this->pass);
-
 
138
					} catch (PDOException $e) {
-
 
139
						$e = sprintf(self::ERREUR_CONNEXION_TPL, $e->getMessage());
-
 
140
						trigger_error($e, E_USER_WARNING);
-
 
141
					}
-
 
142
					break;
-
 
143
				case self::ABSTRACTION_MYSQL :
-
 
144
					$this->connexion = mysql_connect($this->hote, $this->utilisateur, $this->pass);
-
 
145
					if ($this->connexion !== false) {
-
 
146
						$selection = mysql_select_db($this->bdd_nom, $this->connexion);
-
 
147
						if ($selection === false) {
-
 
148
							$e = sprintf(self::ERREUR_SELECTION_BDD_TPL, mysql_error());
-
 
149
							trigger_error($e, E_USER_WARNING);
-
 
150
						}
-
 
151
					} else {
-
 
152
						$e = sprintf(self::ERREUR_CONNEXION_TPL, mysql_error());
-
 
153
						trigger_error($e, E_USER_WARNING);
-
 
154
					}
-
 
155
					break;
-
 
156
				case self::ABSTRACTION_MYSQLI :
-
 
157
					$this->connexion = @new mysqli($this->hote, $this->utilisateur, $this->pass, $this->bdd_nom);
-
 
158
					if ($this->connexion->connect_errno) {
-
 
159
						$e = sprintf(self::ERREUR_CONNEXION_TPL, $this->connexion->connect_error);
-
 
160
						trigger_error($e, E_USER_WARNING);
-
 
161
					}
-
 
162
					break;
-
 
163
				case self::ABSTRACTION_SQLITE3 :
-
 
164
					// cas particulier de sqllite, on considère que le nom de la base de données correspond au fichier à ouvrir
-
 
165
					$this->connexion = new SQLite3($this->bdd_nom);
-
 
166
					if (!$this->connexion) {
-
 
167
						$e = sprintf(self::ERREUR_CONNEXION_TPL, '');
-
 
168
						trigger_error($e, E_USER_WARNING);
-
 
169
					}
157
	final protected function requete($requete) {
170
					break;
-
 
171
				default:
-
 
172
					$this->connexion = null;
-
 
173
			}
-
 
174
	
-
 
175
			if ($this->encodage != null) {
158
		if ($this->connexion == null) {
176
				$this->requete("SET names '".$this->encodage."'");
-
 
177
			}
-
 
178
		}
-
 
179
	}
-
 
180
	
-
 
181
	/**
-
 
182
	 * Execute une requête et retourne le résultat tel que renvoyé par l'abstraction courante.
-
 
183
	 *
-
 
184
	 * @param string la requête à effectuer
-
 
185
	 * @return mixed un objet contenant le résultat de la requête
-
 
186
	 */
-
 
187
	public function requete($requete) {
159
			$this->connecter();
188
		$this->connecter();
160
		}
-
 
161
		$retour = null;
189
 
162
		
190
		$retour = null;
163
		switch ($this->abstraction) {
191
		switch ($this->abstraction) {
164
			case self::ABSTRACTION_PDO :
192
			case self::ABSTRACTION_PDO :
165
				try {
193
				try {
Line 180... Line 208...
180
				break;
208
				break;
181
		}
209
		}
182
		return $retour;
210
		return $retour;
183
	}
211
	}
Line -... Line 212...
-
 
212
 
-
 
213
	/**
-
 
214
	 * Execute une requête et retourne le premier résultat sous forme de tableau (par défaut) ou d'objet.
-
 
215
	 * Les noms des champs de la base de données correspondent aux noms des clés du tableau ou aux noms des attributs de l'objet.
-
 
216
	 *
-
 
217
	 * @param string la requête à effectuer
-
 
218
	 * @param string le mode de retour ASSOC (Bdd::MODE_ASSOC) pour un tableau ou OBJECT (Bdd::MODE_OBJET) pour un objet.
-
 
219
	 * @return mixed un objet ou un tableau contenant le résultat de la requête
184
 
220
	 */
185
	final protected function requeteUn($requete, $mode = self::MODE_ASSOC) {
-
 
186
		if ($this->connexion == null) {
221
	public function requeteUn($requete, $mode = self::MODE_ASSOC) {
187
			$this->connecter();
-
 
Line 188... Line 222...
188
		}
222
		$this->connecter();
189
 
223
 
190
		$retour = null;
224
		$retour = null;
191
		switch ($this->abstraction) {
225
		switch ($this->abstraction) {
192
			case self::ABSTRACTION_PDO :
226
			case self::ABSTRACTION_PDO :
193
				try {
227
				try {
194
					$res_req = $this->connexion->query($requete);
228
					$resultat = $this->connexion->query($requete);
195
					$retour =$res_req->fetch($this->$mode);
229
					$retour = $resultat->fetch($this->$mode);
196
				} catch (PDOException $e) {
230
				} catch (PDOException $e) {
197
					$m = sprintf(self::ERREUR_REQUETE_TPL, $e->getFile(), $e->getLine(), $e->getMessage(), $requete);
231
					$m = sprintf(self::ERREUR_REQUETE_TPL, $e->getFile(), $e->getLine(), $e->getMessage(), $requete);
198
					trigger_error($m, E_USER_WARNING);
232
					trigger_error($m, E_USER_WARNING);
199
				}
233
				}
200
				break;
234
				break;
201
			case self::ABSTRACTION_MYSQL :
235
			case self::ABSTRACTION_MYSQL :
202
				$res = mysql_query($requete,$this->connexion);
236
				$res = mysql_query($requete, $this->connexion);
203
				$fonction_fetch = $this->$mode;
237
				$fonction_fetch = $this->$mode;
204
				$retour = $fonction_fetch($res);
238
				$retour = $fonction_fetch($res);
205
				break;
239
				break;
Line 210... Line 244...
210
				break;
244
				break;
211
			case self::ABSTRACTION_SQLITE3 :
245
			case self::ABSTRACTION_SQLITE3 :
212
				$retour = $this->connexion->querySingle($requete);
246
				$retour = $this->connexion->querySingle($requete);
213
				break;
247
				break;
214
		}
248
		}
215
 
-
 
216
		return $retour;
249
		return $retour;
217
	}
250
	}
Line -... Line 251...
-
 
251
 
-
 
252
	/**
-
 
253
	 * Execute une requête et retourne un tableau de résultats. Un résultat peut être présentés sous forme 
-
 
254
	 * de tableau (par défaut) ou d'objet.
-
 
255
	 * Les noms des champs de la base de données correspondent aux noms des clés du tableau résultat ou 
218
 
256
	 * aux noms des attributs de l'objet résultat.
-
 
257
	 *
-
 
258
	 * @param string la requête à effectuer
-
 
259
	 * @param string le mode de retour des résultats : ASSOC (Bdd::MODE_ASSOC) pour un tableau ou OBJECT (Bdd::MODE_OBJET) pour un objet.
-
 
260
	 * @return array un tableau contenant les résultats sous forme d'objets ou de tableau (par défaut).
219
 
261
	 */
220
	final protected function requeteTous($requete, $mode = self::MODE_ASSOC) {
-
 
221
		if ($this->connexion == null) {
262
	public function requeteTous($requete, $mode = self::MODE_ASSOC) {
222
			$this->connecter();
-
 
Line 223... Line 263...
223
		}
263
		$this->connecter();
224
 
-
 
225
		$retour = null;
264
 
226
 
265
		$retour = null;
227
		switch ($this->abstraction) {
266
		switch ($this->abstraction) {
228
			case self::ABSTRACTION_PDO :
267
			case self::ABSTRACTION_PDO :
229
				try {
268
				try {
230
					$res_req = $this->connexion->query($requete);
269
					$resultat = $this->connexion->query($requete);
231
					if ($res_req !== false) {
270
					if ($resultat !== false) {
232
						$retour = $res_req->fetchAll($this->$mode);
271
						$retour = $resultat->fetchAll($this->$mode);
233
					} else {
272
					} else {
234
						$retour = false;
273
						$retour = false;
235
					}
274
					}
236
				} catch (PDOException $e) {
275
				} catch (PDOException $e) {
237
					$m = sprintf(self::ERREUR_REQUETE_TPL, $e->getFile(), $e->getLine(), $e->getMessage(), $requete);
276
					$m = sprintf(self::ERREUR_REQUETE_TPL, $e->getFile(), $e->getLine(), $e->getMessage(), $requete);
238
					trigger_error($m, E_USER_WARNING);
277
					trigger_error($m, E_USER_WARNING);
239
				}
278
				}
240
				break;
279
				break;
241
			case self::ABSTRACTION_MYSQL :
280
			case self::ABSTRACTION_MYSQL :
242
				$res = mysql_query($requete, $this->connexion);
281
				$resultat = mysql_query($requete, $this->connexion);
243
				$fonction_fetch = $this->$mode;
282
				$fonction_fetch = $this->$mode;
244
				while ($ligne = $fonction_fetch($res)) {
283
				while ($ligne = $fonction_fetch($resultat)) {
245
					$retour[] = $ligne;
284
					$retour[] = $ligne;
246
				}
285
				}
247
				break;
286
				break;
248
			case self::ABSTRACTION_MYSQLI :
287
			case self::ABSTRACTION_MYSQLI :
249
				$res = $this->connexion->query($requete);
288
				$resultat = $this->connexion->query($requete);
250
				$function_fetch = $this->$mode;
289
				$function_fetch = $this->$mode;
251
				while ($ligne = $res->$function_fetch()) {
290
				while ($ligne = $resultat->$function_fetch()) {
252
					$retour[] = $ligne;
291
					$retour[] = $ligne;
253
				}
292
				}
254
				break;
293
				break;
255
			case self::ABSTRACTION_SQLITE3 :
294
			case self::ABSTRACTION_SQLITE3 :
256
				$res = $this->connexion->query($requete);
295
				$resultat = $this->connexion->query($requete);
257
				while ($ligne = $res->fetch_array($this->ASSOC)) {
296
				while ($ligne = $resultat->fetch_array($this->ASSOC)) {
258
					if ($mode == self::MODE_OBJET) {
297
					if ($mode == self::MODE_OBJET) {
259
						// Cas particulier de sqllite qui n'a pas de fonction fetch_object
298
						// Cas particulier de sqllite qui n'a pas de fonction fetch_object
260
						$ligneObjet = new stdClass();
299
						$ligneObjet = new stdClass();
Line 265... Line 304...
265
					}
304
					}
266
					$retour[] = $ligne;
305
					$retour[] = $ligne;
267
				}
306
				}
268
				break;
307
				break;
269
		}
308
		}
270
 
-
 
271
		return $retour;
309
		return $retour;
272
	}
310
	}
Line 273... Line 311...
273
 
311
 
274
	/**
312
	/**
-
 
313
	 * Protège une chaine de caractères avant l'insertion dans la base de données (ajout de quotes ou guillemets).
-
 
314
	 * @param string la chaine à protéger
275
	 * Protège une chaine de caractères avant l'insertion dans la base de données.
315
	 * @return string la chaine protégée
276
	 */
316
	 */
277
	final protected function proteger($chaine) {
-
 
278
		if ($this->connexion == null) {
317
	public function proteger($chaine) {
279
			$this->connecter();
-
 
Line 280... Line 318...
280
		}
318
		$this->connecter();
281
 
-
 
282
		$retour = $chaine;
319
 
283
 
320
		$retour = $chaine;
284
		switch ($this->abstraction) {
321
		switch ($this->abstraction) {
285
			case self::ABSTRACTION_PDO :
322
			case self::ABSTRACTION_PDO :
286
				$retour = $this->connexion->quote($chaine);
323
				$retour = $this->connexion->quote($chaine);
Line 293... Line 330...
293
				break;
330
				break;
294
			case self::ABSTRACTION_SQLITE3 :
331
			case self::ABSTRACTION_SQLITE3 :
295
				$retour = $this->connexion->escapeString($chaine);
332
				$retour = $this->connexion->escapeString($chaine);
296
				break;
333
				break;
297
		}
334
		}
298
 
-
 
299
		return $retour;
335
		return $retour;
300
	}
336
	}
Line 301... Line 337...
301
 
337
 
302
	/**
-
 
303
	 * Initialise les constantes de classe à leur bonne valeur et déclenche une erreur si le protocole n'est pas bien défini.
-
 
304
	 */
-
 
305
	final public function initialiserProtocole() {
-
 
306
		switch ($this->abstraction) {
-
 
307
			case self::ABSTRACTION_PDO :
-
 
308
				$this->ASSOC = PDO::FETCH_ASSOC;
-
 
309
				$this->OBJECT = PDO::FETCH_CLASS;
-
 
310
				break;
-
 
311
			case self::ABSTRACTION_MYSQL :
-
 
312
				$this->ASSOC = 'mysql_fetch_assoc';
-
 
313
				$this->OBJECT = 'mysql_fetch_object';
-
 
314
				break;
-
 
315
			case self::ABSTRACTION_MYSQLI :
-
 
316
				$this->ASSOC = 'fetch_assoc';
-
 
317
				$this->OBJECT = 'fetch_object';
-
 
318
				break;
-
 
319
			case self::ABSTRACTION_SQLITE3 :
-
 
320
				$this->ASSOC = 'SQLITE3_ASSOC';
-
 
321
				$this->OBJECT = 'SQLITE3_OBJECT';
-
 
322
				break;
-
 
323
			default:
-
 
324
				$m = "Erreur : l'abstraction '{$this->abstraction}' n'est pas prise en charge";
-
 
325
				trigger_error($m, E_USER_WARNING);
-
 
326
		}
-
 
327
	}
-
 
328
 
-
 
329
	/**
338
	/**
330
	 * Destructeur de classe, se contente de fermer explicitement la connexion à la base de donnée.
339
	 * Destructeur de classe, se contente de fermer explicitement la connexion à la base de donnée.
331
	 */
340
	 */
332
	final public function __destruct() {
341
	protected function __destruct() {
333
		switch ($this->abstraction) {
342
		switch ($this->abstraction) {
334
			case self::ABSTRACTION_PDO :
343
			case self::ABSTRACTION_PDO :
335
				$this->connexion = null;
344
				$this->connexion = null;
336
				break;
345
				break;