Subversion Repositories Applications.framework

Rev

Rev 79 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
5 aurelien 1
<?php
2
/*vim: set expandtab tabstop=4 shiftwidth=4: */
3
// +------------------------------------------------------------------------------------------------------+
4
// | PHP version 5.0.4                                                                                    |
5
// +------------------------------------------------------------------------------------------------------+
6
// | Copyright (C) 2005 Tela Botanica (accueil@tela-botanica.org)                                         |
7
// +------------------------------------------------------------------------------------------------------+
8
// | This file is part of eFlore-Debogage.                                                                |
9
// |                                                                                                      |
10
// | Foobar is free software; you can redistribute it and/or modify                                       |
11
// | it under the terms of the GNU General Public License as published by                                 |
12
// | the Free Software Foundation; either version 2 of the License, or                                    |
13
// | (at your option) any later version.                                                                  |
14
// |                                                                                                      |
15
// | Foobar is distributed in the hope that it will be useful,                                            |
16
// | but WITHOUT ANY WARRANTY; without even the implied warranty of                                       |
17
// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                                        |
18
// | GNU General Public License for more details.                                                         |
19
// |                                                                                                      |
20
// | You should have received a copy of the GNU General Public License                                    |
21
// | along with Foobar; if not, write to the Free Software                                                |
22
// | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                            |
23
// +------------------------------------------------------------------------------------------------------+
34 aurelien 24
// CVS : $Id: GestionnaireErreur.php 80 2009-08-27 07:30:42Z jpm $
5 aurelien 25
/**
26
* Classe de gestion des erreurs.
27
*
28
*
29
*
30
*@package eFlore
31
*@subpackage Debogage
32
//Auteur original :
33
*@author        Jean-Pascal MILCENT <jpm@tela-botanica.org>
34
//Autres auteurs :
35
*@author        aucun
36
*@copyright     Tela-Botanica 2000-2005
34 aurelien 37
*@version       $Revision: 80 $ $Date: 2009-08-27 09:30:42 +0200 (Thu, 27 Aug 2009) $
5 aurelien 38
// +------------------------------------------------------------------------------------------------------+
39
*/
40
 
41
// +------------------------------------------------------------------------------------------------------+
42
// |                                            ENTETE du PROGRAMME                                       |
43
// +------------------------------------------------------------------------------------------------------+
44
 
45
 
46
// +------------------------------------------------------------------------------------------------------+
47
// |                                            CORPS du PROGRAMME                                        |
48
// +------------------------------------------------------------------------------------------------------+
49
 
50
 
51
/**
52
 * Classe GestionnaireErreur
53
 *
54
 * Gérer les erreurs PHP et SQL.
55
 */
56
class GestionnaireErreur
57
{
58
	/*** Attributes: ***/
59
 
60
	/**
61
	 * Permet de savoir si on utilise PHP en ligne de commande dans une console (PHP-CLI) ou en mode module de serveur.
62
	 * @access private
63
	 */
64
	private $mode;
65
 
66
	/**
67
	 * Contient la liste des erreurs.
68
	 * @access private
69
	 */
70
	private $erreurs;
71
 
72
	/**
73
	 * Permet de savoir si on veut faire apparaître ou pas le contexte de l'erreur,
74
	 * c'est à dire le contenu des variables.
75
	 * @access private
76
	 */
77
	private $contexte;
78
 
79
	/**
80
	 * Contient le niveau d'erreur courant. Celui que l'on donne à la fonction
81
	 * error_reporting().
82
	 * @access private
83
	 */
84
	private $niveau_erreur_courant;
85
 
86
	/**
87
	 * Le gestionnaire d'erreur est un singleton
88
	 */
89
	private static $gestionnaire_erreurs;
90
 
91
	/*** Constructeur: ***/
92
 
93
	/**
94
	 * Construit le gestionnaire d'erreur.
95
	 *
96
	 * @return void
97
	 * @access public
98
	 */
99
	private function __construct( $contexte = false )
100
	{
101
		$this->mode = php_sapi_name();
102
		$this->erreurs = array();
103
		$this->setContexte($contexte);
104
		$this->niveau_erreur_courant = 2048 ;
105
		set_error_handler(array(&$this, 'gererErreur'));
106
	}
107
 
108
	/**
109
	 * Fonction d'accès au singleton
110
	 * @return GestionnaireErreur le gestionnaire d'erreurs courant
111
	 */
112
	public static function getInstance()
113
	{
114
		if (self::$gestionnaire_erreurs instanceof GestionnaireErreur) {
115
			return self::$gestionnaire_erreurs;
116
		}
117
		self::$gestionnaire_erreurs = new GestionnaireErreur ;
118
	    return self::$gestionnaire_erreurs;
119
	}
120
 
121
	/*** Accesseurs: ***/
122
	/**
123
	 * Récupère le tableau des erreurs.
124
	 *
125
	 * @return array
126
	 * @access public
127
	 */
128
	public function getErreur( ) {
129
		return $this->erreurs;
130
	}
131
 
132
	/**
133
	 * Ajoute une erreur à la liste.
134
	 *
135
	 * @param array une_erreur
136
	 * @return void
137
	 * @access public
138
	 */
139
	public function setErreur( $une_erreur ) {
140
		$this->erreurs[] = $une_erreur;
141
	}
142
 
143
	/**
144
	 * Récupère la valeur du contexte.
145
	 *
146
	 * @return boolean
147
	 * @access public
148
	 */
149
	public function getContexte( ) {
150
		return $this->contexte;
151
	}
152
 
153
	/**
154
	 * Définit si oui ou non le contexte sera affiché.
155
	 *
156
	 * @param boolean un_contexte
157
	 * @return  void
158
	 * @access public
159
	 */
160
	public function setContexte( $un_contexte ) {
161
		$this->contexte = $un_contexte;
162
	}
163
 
164
	/**
165
	 * Récupère le niveau d'erreur courrant.
166
	 *
167
	 * @return int le niveau d'erreur courrant.
168
	 * @access public
169
	 */
170
	public function getNiveauErreurCourant( ) {
171
		return (int)$this->niveau_erreur_courant;
172
	}
173
 
174
	/**
175
	 * Définit le niveau d'erreur courrant.
176
	 *
177
	 * @param int un niveau d'erreur.
178
	 * @return void
179
	 * @access public
180
	 */
181
	public function setNiveauErreurCourant( $niveau = 2048 ) {
182
		$this->niveau_erreur_courant = $niveau;
183
	}
184
 
185
	/**
186
	 * Définit le niveau d'erreur courrant (synonyme fonction precedente)
187
	 *
188
	 * @param int un niveau d'erreur.
189
	 * @return void
190
	 * @access public
191
	 */
192
	public function setActive ($niveau) {
193
		$this->niveau_erreur_courant = $niveau;
194
	}
195
 
196
 
197
	/*** Méthodes : ***/
198
 
199
	/**
200
	 *
201
	 * @param int niveau
202
	 * @param string message
203
	 * @param string fichier
204
	 * @param int ligne
205
	 * @param boolean contexte
206
	 * @return void
207
	 * @access public
208
	 */
209
	public function gererErreur($niveau,  $message,  $fichier,  $ligne,  $contexte)
210
	{
211
		$aso_erreur = array();
212
		// Nous vérifions si nous affichons ou pas l'erreur en fonction du niveau demandé
213
		if ( $niveau <= $this->getNiveauErreurCourant() ) {
214
			$aso_erreur['niveau'] = $niveau;
215
			switch ($niveau) {
216
				case E_USER_NOTICE :
217
					if (is_array($message) || is_object($message)) {
218
						$aso_erreur['message'] = print_r($message, true);
219
					} else {
220
						$aso_erreur['message'] = $message;
221
					}
222
					break;
223
				default:
224
					$aso_erreur['message'] = $message;
225
			}
226
 
227
			$aso_erreur['fichier'] = $fichier;
228
			$aso_erreur['ligne'] = $ligne;
229
			if ($this->getContexte()) {
230
				$aso_erreur['contexte'] = $contexte;
231
			}
232
			$this->setErreur($aso_erreur);
233
		}
234
 
235
		echo print_r($this->erreurs,true) ;
236
		exit() ;
237
		// Si nous avons à faire à une erreur et non à un warning ou une notice, nous arrêtons l'exécution du script
238
		switch ($niveau) {
239
			case E_ERROR :
240
			case E_USER_ERROR :
241
				die($this->retournerErreur());
242
				break;
243
		}
244
	}
245
 
246
	/**
247
	 * Retourne l'erreur PHP formatée en XHTML.
248
	 *
249
	 * @return string
250
	 * @access public
251
	 */
252
	public function retournerErreur()
253
	{
254
		$retour = '';
255
		foreach($this->getErreur() as $aso_erreur) {
256
			if ('<!-- BEGIN sql -->' == substr($aso_erreur['message'], 0, 18)) {
257
				$retour .= $aso_erreur['message'];
258
				continue;
259
			}
260
 
261
			switch ($this->mode) {
262
				case 'cli' :
263
					if ($aso_erreur['niveau'] == E_USER_NOTICE) {
264
						$retour .= $aso_erreur['message']."\n";
265
						$retour .= 'Fichier : '.$aso_erreur['fichier']."\n";
266
						$retour .= 'Ligne : '.$aso_erreur['ligne']."\n";
267
					} else if ($aso_erreur['niveau'] <= 512) {
268
						$retour .= 'INFO : Niveau '.$aso_erreur['niveau']."\n";
269
					} else {
270
						$retour .= 'ERREUR : Niveau '.$aso_erreur['niveau']."\n";
271
					}
272
					$retour .= 'Niveau : '.$aso_erreur['niveau']."\n";
273
					$retour .= 'Message : '.$aso_erreur['message']."\n";
274
					$retour .= 'Fichier : '.$aso_erreur['fichier']."\n";
275
					$retour .= 'Ligne : '.$aso_erreur['ligne']."\n";
276
					if ($this->getContexte()) {
277
						$retour .= 'Contexte : '."\n".print_r($aso_erreur['contexte'], true)."\n";
278
					}
279
					break;
280
				default:
281
					if ($aso_erreur['niveau'] == E_USER_NOTICE) {
282
						$retour .= '<pre class="debogage">'."\n";
283
						$retour .= htmlentities($aso_erreur['message'])."\n";
284
						$retour .= '<span class="debogage_fichier">'.'Fichier : '.$aso_erreur['fichier'].'</span>'."\n";
285
						$retour .= '<span class="debogage_ligne">'.'Ligne : '.$aso_erreur['ligne'].'</span>'."\n";
286
						$retour .= '</pre>'."\n";
287
						continue;
288
					} else if ($aso_erreur['niveau'] <= 512) {
289
						$retour .= '<p class="information">'."\n";
290
						$retour .= '<strong>INFO : Niveau '.$aso_erreur['niveau'].'</strong><br />'."\n";
291
					} else {
292
						$retour .= '<p class="attention">'."\n";
293
						$retour .= '<strong>ERREUR : Niveau '.$aso_erreur['niveau'].'</strong><br />'."\n";
294
					}
295
					$retour .= '<strong>Niveau : </strong>'.$aso_erreur['niveau'].'<br />'."\n";
296
					$retour .= '<strong>Message : </strong>'.$aso_erreur['message'].'<br />'."\n";
297
					$retour .= '<strong>Fichier : </strong>'.$aso_erreur['fichier'].'<br />'."\n";
298
					$retour .= '<strong>Ligne : </strong>'.$aso_erreur['ligne'].'<br />'."\n";
299
					if ($this->getContexte()) {
300
						$retour .= '<pre>'."\n";
301
						$retour .= '<strong>Contexte : </strong>'."\n".print_r($aso_erreur['contexte'], true)."\n";
302
						$retour .= '</pre>'."\n";
303
					}
304
					$retour .= '</p>'."\n";
305
			}
306
		}
307
 
308
		return $retour;
309
	}
310
 
311
	/**
312
	* Retourne l'erreur SQL formatée en XHTML.
313
	*
314
	* @param string fichier
315
	* @param int ligne
316
	* @param string message
317
	* @param string requete
318
	* @param string autres
319
	* @return string
320
	* @static
321
	* @access public
322
	*/
323
	public static function retournerErreurSql( $fichier,  $methode,  $message,  $requete = null,  $autres = null )
324
	{
325
		$retour = '';
326
		switch (php_sapi_name()) {
327
			case 'cli' :
328
				$retour .= 'ERREUR SQL '."\n";
329
				$retour .= 'Fichier : '.$fichier."\n";
330
				$retour .= 'Méthode : '.$methode."\n";
331
				$retour .= 'Message : '.$message."\n";
332
				if (!is_null($requete)) {
333
					$retour .= 'Requete : '."\n";
334
					$retour .= $requete."\n";
335
		    	}
336
 
337
				if (!is_null($autres)) {
338
					$retour .= 'Autres infos : '."\n";
339
					$retour .= $autres."\n";
340
				}
341
				break;
342
			default:
343
				$retour .= '<!-- BEGIN sql -->';
344
				$retour .= '<div id="zone_erreur">'."\n";
345
				$retour .= '<h1 > ERREUR SQL </h1><br />'."\n";
346
				$retour .= '<dl>'."\n";
347
				$retour .= '<dt> Fichier : </dt> ';
348
				$retour .= '<dd> '.$fichier.'</dd>'."\n";
349
 
350
				$retour .= '<dt> Méthode : </dt> ';
351
				$retour .= '<dd> '.$methode.'</dd>'."\n";
352
 
353
				$retour .= '<dt> Message erreur : </dt> ';
354
				$retour .= '<dd> '.$message.'</dd>'."\n";
355
 
356
				if (!is_null($requete)) {
357
					$retour .= '<dt> Requete : </dt> ';
358
					$retour .= '<dd> '.$requete.' </dd>'."\n";
359
		    	}
360
 
361
				if (!is_null($autres)) {
362
					$retour .= '<dt> Autres infos : </dt> ';
363
					$retour .= '<dd> '.$autres.' </dd>'."\n";
364
				}
365
				$retour .= '</dl>'."\n";
366
				$retour .= '</div>'."\n";
367
				$retour .= '<!-- END sql -->'."\n";
368
		}
369
		return $retour;
370
	}
371
}
372
?>