Subversion Repositories Sites.tela-botanica.org

Rev

Rev 609 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
376 jpm 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
// +------------------------------------------------------------------------------------------------------+
24
// CVS : $Id: GestionnaireErreur.class.php,v 1.6 2007-07-09 18:54:43 jp_milcent Exp $
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
37
*@version       $Revision: 1.6 $ $Date: 2007-07-09 18:54:43 $
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 courrant. Celui que l'on donne à la fonction
81
	 * error_reporting().
82
	 * @access private
83
	 */
84
	private $niveau_erreur_courrant;
85
 
86
	/*** Constructeur: ***/
87
 
88
	/**
89
	 * Construit le gestionnaire d'erreur.
90
	 *
91
	 * @return void
92
	 * @access public
93
	 */
94
	public function __construct( $contexte = false )
95
	{
96
		$this->mode = php_sapi_name();
97
		$this->erreurs = array();
98
		$this->setContexte($contexte);
99
		set_error_handler(array(&$this, 'gererErreur'));
100
	}
101
 
102
	/*** Accesseurs: ***/
103
	 // end of member function __construct
104
	/**
105
	 * Récupère le tableau des erreurs.
106
	 *
107
	 * @return array
108
	 * @access public
109
	 */
110
	public function getErreur( ) {
111
		return $this->erreurs;
112
	}
113
 
114
	/**
115
	 * Ajoute une erreur à la liste.
116
	 *
117
	 * @param array une_erreur
118
	 * @return void
119
	 * @access public
120
	 */
121
	public function setErreur( $une_erreur ) {
122
		$this->erreurs[] = $une_erreur;
123
	}
124
 
125
	/**
126
	 * Récupère la valeur du contexte.
127
	 *
128
	 * @return boolean
129
	 * @access public
130
	 */
131
	public function getContexte( ) {
132
		return $this->contexte;
133
	}
134
 
135
	/**
136
	 * Définit si oui ou non le contexte sera affiché.
137
	 *
138
	 * @param boolean un_contexte
139
	 * @return  void
140
	 * @access public
141
	 */
142
	public function setContexte( $un_contexte ) {
143
		$this->contexte = $un_contexte;
144
	}
145
 
146
	/**
147
	 * Récupère le niveau d'erreur courrant.
148
	 *
149
	 * @return int le niveau d'erreur courrant.
150
	 * @access public
151
	 */
152
	public function getNiveauErreurCourrant( ) {
153
		return (int)$this->niveau_erreur_courrant;
154
	}
155
 
156
	/**
157
	 * Définit le niveau d'erreur courrant.
158
	 *
159
	 * @param int un niveau d'erreur.
160
	 * @return void
161
	 * @access public
162
	 */
163
	public function setNiveauErreurCourrant( $niveau = 2048 ) {
164
		$this->niveau_erreur_courrant = $niveau;
165
	}
166
 
167
	/**
168
	 * Définit le niveau d'erreur courrant (synonyme fonction precedente)
169
	 *
170
	 * @param int un niveau d'erreur.
171
	 * @return void
172
	 * @access public
173
	 */
174
	public function setActive ($niveau) {
175
		$this->niveau_erreur_courrant = $niveau;
176
	}
177
 
178
 
179
	/*** Méthodes : ***/
180
 
181
	/**
182
	 *
183
	 * @param int niveau
184
	 * @param string message
185
	 * @param string fichier
186
	 * @param int ligne
187
	 * @param boolean contexte
188
	 * @return void
189
	 * @access public
190
	 */
191
	public function gererErreur($niveau,  $message,  $fichier,  $ligne,  $contexte)
192
	{
193
		$aso_erreur = array();
194
		// Nous vérifions si nous affichons ou pas l'erreur en fonction du niveau demandé
195
		if ( $niveau <= $this->getNiveauErreurCourrant() ) {
196
			$aso_erreur['niveau'] = $niveau;
197
			$aso_erreur['message'] = $message;
198
			$aso_erreur['fichier'] = $fichier;
199
			$aso_erreur['ligne'] = $ligne;
200
			if ($this->getContexte()) {
201
				$aso_erreur['contexte'] = $contexte;
202
			}
203
			$this->setErreur($aso_erreur);
204
		}
205
		// Si nous avons à faire à une erreur et non à un warning ou une notice, nous arrêtons l'exécution du script
206
		switch ($niveau) {
207
			case E_ERROR :
208
			case E_USER_ERROR :
209
				die($this->retournerErreur());
210
				break;
211
		}
212
	}
213
 
214
	/**
215
	 * Retourne l'erreur PHP formatée en XHTML.
216
	 *
217
	 * @return string
218
	 * @access public
219
	 */
220
	public function retournerErreur()
221
	{
222
		$retour = '';
223
		$erreur_pear_nbre = 0;
224
		$erreur_pear_fichier_nbre = 0;
225
		$erreur_pear_message_nbre = 0;
226
		foreach($this->getErreur() as $aso_erreur) {
227
			if ('<!-- BEGIN sql -->' == substr($aso_erreur['message'], 0, 18)) {
228
				$retour .= $aso_erreur['message'];
229
				continue;
230
			}
231
			// Nous testons les erreurs PEAR pour ne pas en tenir compte
232
			if (!SC_DEBOGAGE_PEAR && stristr($aso_erreur['fichier'], SC_DEBOGAGE_PEAR_CHAINE)) {
233
				$erreur_pear_fichier_nbre++;
234
			} else if (!SC_DEBOGAGE_PEAR && preg_match(SC_DEBOGAGE_PEAR_REGEXP_MESSAGE, $aso_erreur['message'])) {
235
				$erreur_pear_message_nbre++;
236
			} else {
237
				switch ($this->mode) {
238
					case 'cli' :
239
						if ($aso_erreur['niveau'] == E_USER_NOTICE) {
240
							$retour .= $aso_erreur['message']."\n";
241
							$retour .= 'Fichier : '.$aso_erreur['fichier']."\n";
242
							$retour .= 'Ligne : '.$aso_erreur['ligne']."\n";
243
						} else if ($aso_erreur['niveau'] <= 512) {
244
							$retour .= 'INFO : Niveau '.$aso_erreur['niveau']."\n";
245
						} else {
246
							$retour .= 'ERREUR : Niveau '.$aso_erreur['niveau']."\n";
247
						}
248
						$retour .= 'Niveau : '.$aso_erreur['niveau']."\n";
249
						$retour .= 'Message : '.$aso_erreur['message']."\n";
250
						$retour .= 'Fichier : '.$aso_erreur['fichier']."\n";
251
						$retour .= 'Ligne : '.$aso_erreur['ligne']."\n";
252
						if ($this->getContexte()) {
253
							$retour .= 'Contexte : '."\n".print_r($aso_erreur['contexte'], true)."\n";
254
						}
255
						break;
256
					default:
257
						if ($aso_erreur['niveau'] == E_USER_NOTICE) {
258
							$retour .= '<pre class="debogage">'."\n";
259
							$retour .= htmlentities($aso_erreur['message'])."\n";
260
							$retour .= '<span class="debogage_fichier">'.'Fichier : '.$aso_erreur['fichier'].'</span>'."\n";
261
							$retour .= '<span class="debogage_ligne">'.'Ligne : '.$aso_erreur['ligne'].'</span>'."\n";
262
							$retour .= '</pre>'."\n";
263
							continue;
264
						} else if ($aso_erreur['niveau'] <= 512) {
265
							$retour .= '<p class="information">'."\n";
266
							$retour .= '<strong>INFO : Niveau '.$aso_erreur['niveau'].'</strong><br />'."\n";
267
						} else {
268
							$retour .= '<p class="attention">'."\n";
269
							$retour .= '<strong>ERREUR : Niveau '.$aso_erreur['niveau'].'</strong><br />'."\n";
270
						}
271
						$retour .= '<strong>Niveau : </strong>'.$aso_erreur['niveau'].'<br />'."\n";
272
						$retour .= '<strong>Message : </strong>'.$aso_erreur['message'].'<br />'."\n";
273
						$retour .= '<strong>Fichier : </strong>'.$aso_erreur['fichier'].'<br />'."\n";
274
						$retour .= '<strong>Ligne : </strong>'.$aso_erreur['ligne'].'<br />'."\n";
275
						if ($this->getContexte()) {
276
							$retour .= '<pre>'."\n";
277
							$retour .= '<stong>Contexte : </stong>'."\n".print_r($aso_erreur['contexte'], true)."\n";
278
							$retour .= '</pre>'."\n";
279
						}
280
						$retour .= '</p>'."\n";
281
				}
282
			}
283
		}
284
		$erreur_pear_nbre = $erreur_pear_fichier_nbre + $erreur_pear_message_nbre;
285
		if ($erreur_pear_nbre != 0) {
286
			$retour .= 	'<p class="attention">'.
287
						'<strong>Nombre d\'erreurs PEAR totales : </strong>'.$erreur_pear_nbre.'<br />'."\n".
288
						'<strong> - éliminées car le "fichier" contené '.SC_DEBOGAGE_PEAR_CHAINE.' : </strong>'.$erreur_pear_fichier_nbre.'<br />'."\n".
289
						'<strong> - éliminées car le "message" correspondé à '.SC_DEBOGAGE_PEAR_REGEXP_MESSAGE.' : </strong>'.$erreur_pear_message_nbre.'<br />'."\n".
290
						'</p>'."\n";
291
		}
292
		return $retour;
293
	}
294
 
295
	/**
296
	* Retourne l'erreur SQL formatée en XHTML.
297
	*
298
	* @param string fichier
299
	* @param int ligne
300
	* @param string message
301
	* @param string requete
302
	* @param string autres
303
	* @return string
304
	* @static
305
	* @access public
306
	*/
307
	public static function retournerErreurSql( $fichier,  $methode,  $message,  $requete = null,  $autres = null )
308
	{
309
		$retour = '';
310
		switch (php_sapi_name()) {
311
			case 'cli' :
312
				$retour .= 'ERREUR SQL '."\n";
313
				$retour .= 'Fichier : '.$fichier."\n";
314
				$retour .= 'Méthode : '.$methode."\n";
315
				$retour .= 'Message : '.$message."\n";
316
				if (!is_null($requete)) {
317
					$retour .= 'Requete : '."\n";
318
					$retour .= $requete."\n";
319
		    	}
320
 
321
				if (!is_null($autres)) {
322
					$retour .= 'Autres infos : '."\n";
323
					$retour .= $autres."\n";
324
				}
325
				break;
326
			default:
327
				$retour .= '<!-- BEGIN sql -->';
328
				$retour .= '<div id="zone_erreur">'."\n";
329
				$retour .= '<h1 > ERREUR SQL </h1><br />'."\n";
330
				$retour .= '<dl>'."\n";
331
				$retour .= '<dt> Fichier : </dt> ';
332
				$retour .= '<dd> '.$fichier.'</dd>'."\n";
333
 
334
				$retour .= '<dt> Méthode : </dt> ';
335
				$retour .= '<dd> '.$methode.'</dd>'."\n";
336
 
337
				$retour .= '<dt> Message erreur : </dt> ';
338
				$retour .= '<dd> '.$message.'</dd>'."\n";
339
 
340
				if (!is_null($requete)) {
341
					$retour .= '<dt> Requete : </dt> ';
342
					$retour .= '<dd> '.$requete.' </dd>'."\n";
343
		    	}
344
 
345
				if (!is_null($autres)) {
346
					$retour .= '<dt> Autres infos : </dt> ';
347
					$retour .= '<dd> '.$autres.' </dd>'."\n";
348
				}
349
				$retour .= '</dl>'."\n";
350
				$retour .= '</div>'."\n";
351
				$retour .= '<!-- END sql -->'."\n";
352
		}
353
		return $retour;
354
	}
355
}
356
 
357
/* +--Fin du code ----------------------------------------------------------------------------------------+
358
*
359
* $Log: GestionnaireErreur.class.php,v $
360
* Revision 1.6  2007-07-09 18:54:43  jp_milcent
361
* Remplacement des balises html par des entités pour le message des E_USER_NOTICE.
362
*
363
* Revision 1.5  2007-07-02 15:31:53  jp_milcent
364
* Initialisation d'une variable.
365
*
366
* Revision 1.4  2007-07-02 12:43:09  jp_milcent
367
* Gestion de php-cli ou cgi...
368
*
369
* Revision 1.3  2007-07-02 10:50:06  jp_milcent
370
* Ajout de la gestion du mode d'affichage (xhtml ou txt).
371
*
372
* Revision 1.2  2007-01-15 15:30:03  jp_milcent
373
* Amélioration du gestionnaire d'erreur pour qu'il prenne en compte les erreurs Pear des méthodes "non static"...
374
*
375
* Revision 1.1  2007/01/12 13:16:09  jp_milcent
376
* Déplacement des classes de débogage et d'optimisation dans le dossier noyau.
377
*
378
* Revision 1.9  2006/10/25 08:15:23  jp_milcent
379
* Fusion avec la livraison Decaisne.
380
*
381
* Revision 1.8.2.1  2006/08/29 09:22:37  jp_milcent
382
* Correction et amélioration du gestionnaire d'erreurs.
383
*
384
* Revision 1.8  2006/07/20 13:33:46  jp_milcent
385
* Légère modif affichage.
386
*
387
* Revision 1.7  2006/07/20 13:33:03  jp_milcent
388
* Amélioration du gestionnaire d'erreur.
389
*
390
* Revision 1.6  2006/07/20 13:27:07  jp_milcent
391
* Ajout du type information.
392
*
393
* Revision 1.5  2006/05/29 13:52:41  ddelon
394
* Integration wiki dans eflore
395
*
396
* Revision 1.4  2005/12/09 10:47:05  jp_milcent
397
* Amélioration du Gestionnaire de Bogues.
398
*
399
* Revision 1.3  2005/10/10 07:28:07  jp_milcent
400
* Utilisation du webservice Yahoo-Image.
401
*
402
* Revision 1.2  2005/10/04 16:34:03  jp_milcent
403
* Début gestion de la chorologie.
404
* Ajout de la bibliothèque de cartographie (à améliorer!).
405
*
406
* Revision 1.1  2005/08/04 15:51:45  jp_milcent
407
* Implémentation de la gestion via DAO.
408
* Fin page d'accueil.
409
* Fin formulaire recherche taxonomique.
410
*
411
* Revision 1.3  2005/08/02 16:19:33  jp_milcent
412
* Amélioration des requetes de recherche de noms.
413
*
414
* Revision 1.2  2005/08/01 16:18:39  jp_milcent
415
* Début gestion résultat de la recherche par nom.
416
*
417
* Revision 1.1  2005/07/28 15:37:56  jp_milcent
418
* Début gestion des squelettes et de l'API eFlore.
419
*
420
*
421
* +-- Fin du code ----------------------------------------------------------------------------------------+
422
*/
423
?>