Subversion Repositories Applications.framework

Rev

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

Rev Author Line No. Line
5 aurelien 1
<?php
105 aurelien 2
// declare(encoding='UTF-8');
5 aurelien 3
/**
105 aurelien 4
* classe de gestion des erreurs.
5 aurelien 5
*
105 aurelien 6
* PHP Version 5
7
*
8
* @category  Class
9
* @package   Framework
10
* @author    Jean-Pascal Milcent <jpm@tela-botanica.org>
11
* @copyright 2009 Tela-Botanica
12
* @license   http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
13
* @license   http://www.gnu.org/licenses/gpl.html Licence GNU-GPL
14
* @version   SVN: $$Id: GestionnaireErreur.php 105 2009-08-31 15:25:05Z aurelien $$
15
* @link      /doc/framework/
16
*
5 aurelien 17
*/
18
class GestionnaireErreur
19
{
105 aurelien 20
	/*** Attributs: ***/
5 aurelien 21
 
22
	/**
23
	 * Permet de savoir si on utilise PHP en ligne de commande dans une console (PHP-CLI) ou en mode module de serveur.
24
	 * @access private
25
	 */
26
	private $mode;
27
 
28
	/**
29
	 * Contient la liste des erreurs.
30
	 * @access private
31
	 */
32
	private $erreurs;
33
 
34
	/**
105 aurelien 35
	 * Permet de savoir si on veut faire apparaître ou pas le contexte de l'erreur,
36
	 * c'est à dire le contenu des variables.
5 aurelien 37
	 * @access private
38
	 */
39
	private $contexte;
40
 
41
	/**
105 aurelien 42
	 * Contient le niveau d'erreur courant. Celui que l'on donne à la fonction
5 aurelien 43
	 * error_reporting().
44
	 * @access private
45
	 */
46
	private $niveau_erreur_courant;
47
 
48
	/**
49
	 * Le gestionnaire d'erreur est un singleton
50
	 */
51
	private static $gestionnaire_erreurs;
52
 
53
	/*** Constructeur: ***/
54
 
55
	/**
56
	 * Construit le gestionnaire d'erreur.
57
	 *
58
	 * @return void
59
	 * @access public
60
	 */
61
	private function __construct( $contexte = false )
62
	{
63
		$this->mode = php_sapi_name();
64
		$this->erreurs = array();
65
		$this->setContexte($contexte);
66
		$this->niveau_erreur_courant = 2048 ;
67
		set_error_handler(array(&$this, 'gererErreur'));
68
	}
69
 
70
	/**
105 aurelien 71
	 * Fonction d'accès au singleton
5 aurelien 72
	 * @return GestionnaireErreur le gestionnaire d'erreurs courant
73
	 */
74
	public static function getInstance()
75
	{
76
		if (self::$gestionnaire_erreurs instanceof GestionnaireErreur) {
77
			return self::$gestionnaire_erreurs;
78
		}
79
		self::$gestionnaire_erreurs = new GestionnaireErreur ;
80
	    return self::$gestionnaire_erreurs;
81
	}
82
 
83
	/*** Accesseurs: ***/
84
	/**
105 aurelien 85
	 * Récupère le tableau des erreurs.
5 aurelien 86
	 *
87
	 * @return array
88
	 * @access public
89
	 */
90
	public function getErreur( ) {
91
		return $this->erreurs;
92
	}
93
 
94
	/**
105 aurelien 95
	 * Ajoute une erreur à la liste.
5 aurelien 96
	 *
97
	 * @param array une_erreur
98
	 * @return void
99
	 * @access public
100
	 */
101
	public function setErreur( $une_erreur ) {
102
		$this->erreurs[] = $une_erreur;
103
	}
104
 
105
	/**
105 aurelien 106
	 * Récupère la valeur du contexte.
5 aurelien 107
	 *
108
	 * @return boolean
109
	 * @access public
110
	 */
111
	public function getContexte( ) {
112
		return $this->contexte;
113
	}
114
 
115
	/**
105 aurelien 116
	 * Définit si oui ou non le contexte sera affiché.
5 aurelien 117
	 *
118
	 * @param boolean un_contexte
119
	 * @return  void
120
	 * @access public
121
	 */
122
	public function setContexte( $un_contexte ) {
123
		$this->contexte = $un_contexte;
124
	}
125
 
126
	/**
105 aurelien 127
	 * Récupère le niveau d'erreur courrant.
5 aurelien 128
	 *
129
	 * @return int le niveau d'erreur courrant.
130
	 * @access public
131
	 */
132
	public function getNiveauErreurCourant( ) {
133
		return (int)$this->niveau_erreur_courant;
134
	}
135
 
136
	/**
105 aurelien 137
	 * Définit le niveau d'erreur courrant.
5 aurelien 138
	 *
139
	 * @param int un niveau d'erreur.
140
	 * @return void
141
	 * @access public
142
	 */
143
	public function setNiveauErreurCourant( $niveau = 2048 ) {
144
		$this->niveau_erreur_courant = $niveau;
145
	}
146
 
147
	/**
105 aurelien 148
	 * Définit le niveau d'erreur courrant (synonyme fonction precedente)
5 aurelien 149
	 *
150
	 * @param int un niveau d'erreur.
151
	 * @return void
152
	 * @access public
153
	 */
154
	public function setActive ($niveau) {
155
		$this->niveau_erreur_courant = $niveau;
156
	}
157
 
158
 
105 aurelien 159
	/*** Méthodes : ***/
5 aurelien 160
 
161
	/**
162
	 *
163
	 * @param int niveau
164
	 * @param string message
165
	 * @param string fichier
166
	 * @param int ligne
167
	 * @param boolean contexte
168
	 * @return void
169
	 * @access public
170
	 */
171
	public function gererErreur($niveau,  $message,  $fichier,  $ligne,  $contexte)
172
	{
173
		$aso_erreur = array();
105 aurelien 174
		// Nous vérifions si nous affichons ou pas l'erreur en fonction du niveau demandé
5 aurelien 175
		if ( $niveau <= $this->getNiveauErreurCourant() ) {
176
			$aso_erreur['niveau'] = $niveau;
177
			switch ($niveau) {
178
				case E_USER_NOTICE :
179
					if (is_array($message) || is_object($message)) {
180
						$aso_erreur['message'] = print_r($message, true);
181
					} else {
182
						$aso_erreur['message'] = $message;
183
					}
184
					break;
185
				default:
186
					$aso_erreur['message'] = $message;
187
			}
188
 
189
			$aso_erreur['fichier'] = $fichier;
190
			$aso_erreur['ligne'] = $ligne;
191
			if ($this->getContexte()) {
192
				$aso_erreur['contexte'] = $contexte;
193
			}
194
			$this->setErreur($aso_erreur);
195
		}
196
 
197
		echo print_r($this->erreurs,true) ;
198
		exit() ;
105 aurelien 199
		// Si nous avons affaire à une erreur et non à un warning ou une notice, nous arrêtons l'exécution du script
5 aurelien 200
		switch ($niveau) {
201
			case E_ERROR :
202
			case E_USER_ERROR :
203
				die($this->retournerErreur());
204
				break;
205
		}
206
	}
207
 
208
	/**
105 aurelien 209
	 * Retourne l'erreur PHP formatée en XHTML.
5 aurelien 210
	 *
211
	 * @return string
212
	 * @access public
213
	 */
214
	public function retournerErreur()
215
	{
216
		$retour = '';
217
		foreach($this->getErreur() as $aso_erreur) {
218
			if ('<!-- BEGIN sql -->' == substr($aso_erreur['message'], 0, 18)) {
219
				$retour .= $aso_erreur['message'];
220
				continue;
221
			}
222
 
223
			switch ($this->mode) {
224
				case 'cli' :
225
					if ($aso_erreur['niveau'] == E_USER_NOTICE) {
226
						$retour .= $aso_erreur['message']."\n";
227
						$retour .= 'Fichier : '.$aso_erreur['fichier']."\n";
228
						$retour .= 'Ligne : '.$aso_erreur['ligne']."\n";
229
					} else if ($aso_erreur['niveau'] <= 512) {
230
						$retour .= 'INFO : Niveau '.$aso_erreur['niveau']."\n";
231
					} else {
232
						$retour .= 'ERREUR : Niveau '.$aso_erreur['niveau']."\n";
233
					}
234
					$retour .= 'Niveau : '.$aso_erreur['niveau']."\n";
235
					$retour .= 'Message : '.$aso_erreur['message']."\n";
236
					$retour .= 'Fichier : '.$aso_erreur['fichier']."\n";
237
					$retour .= 'Ligne : '.$aso_erreur['ligne']."\n";
238
					if ($this->getContexte()) {
239
						$retour .= 'Contexte : '."\n".print_r($aso_erreur['contexte'], true)."\n";
240
					}
241
					break;
242
				default:
243
					if ($aso_erreur['niveau'] == E_USER_NOTICE) {
244
						$retour .= '<pre class="debogage">'."\n";
245
						$retour .= htmlentities($aso_erreur['message'])."\n";
246
						$retour .= '<span class="debogage_fichier">'.'Fichier : '.$aso_erreur['fichier'].'</span>'."\n";
247
						$retour .= '<span class="debogage_ligne">'.'Ligne : '.$aso_erreur['ligne'].'</span>'."\n";
248
						$retour .= '</pre>'."\n";
249
						continue;
250
					} else if ($aso_erreur['niveau'] <= 512) {
251
						$retour .= '<p class="information">'."\n";
252
						$retour .= '<strong>INFO : Niveau '.$aso_erreur['niveau'].'</strong><br />'."\n";
253
					} else {
254
						$retour .= '<p class="attention">'."\n";
255
						$retour .= '<strong>ERREUR : Niveau '.$aso_erreur['niveau'].'</strong><br />'."\n";
256
					}
257
					$retour .= '<strong>Niveau : </strong>'.$aso_erreur['niveau'].'<br />'."\n";
258
					$retour .= '<strong>Message : </strong>'.$aso_erreur['message'].'<br />'."\n";
259
					$retour .= '<strong>Fichier : </strong>'.$aso_erreur['fichier'].'<br />'."\n";
260
					$retour .= '<strong>Ligne : </strong>'.$aso_erreur['ligne'].'<br />'."\n";
261
					if ($this->getContexte()) {
262
						$retour .= '<pre>'."\n";
263
						$retour .= '<strong>Contexte : </strong>'."\n".print_r($aso_erreur['contexte'], true)."\n";
264
						$retour .= '</pre>'."\n";
265
					}
266
					$retour .= '</p>'."\n";
267
			}
268
		}
269
 
270
		return $retour;
271
	}
272
 
273
	/**
105 aurelien 274
	* Retourne l'erreur SQL formatée en XHTML.
5 aurelien 275
	*
276
	* @param string fichier
277
	* @param int ligne
278
	* @param string message
279
	* @param string requete
280
	* @param string autres
281
	* @return string
282
	* @static
283
	* @access public
284
	*/
285
	public static function retournerErreurSql( $fichier,  $methode,  $message,  $requete = null,  $autres = null )
286
	{
287
		$retour = '';
288
		switch (php_sapi_name()) {
289
			case 'cli' :
290
				$retour .= 'ERREUR SQL '."\n";
291
				$retour .= 'Fichier : '.$fichier."\n";
105 aurelien 292
				$retour .= 'Méthode : '.$methode."\n";
5 aurelien 293
				$retour .= 'Message : '.$message."\n";
294
				if (!is_null($requete)) {
295
					$retour .= 'Requete : '."\n";
296
					$retour .= $requete."\n";
297
		    	}
298
 
299
				if (!is_null($autres)) {
300
					$retour .= 'Autres infos : '."\n";
301
					$retour .= $autres."\n";
302
				}
303
				break;
304
			default:
305
				$retour .= '<!-- BEGIN sql -->';
306
				$retour .= '<div id="zone_erreur">'."\n";
307
				$retour .= '<h1 > ERREUR SQL </h1><br />'."\n";
308
				$retour .= '<dl>'."\n";
309
				$retour .= '<dt> Fichier : </dt> ';
310
				$retour .= '<dd> '.$fichier.'</dd>'."\n";
311
 
105 aurelien 312
				$retour .= '<dt> Méthode : </dt> ';
5 aurelien 313
				$retour .= '<dd> '.$methode.'</dd>'."\n";
314
 
315
				$retour .= '<dt> Message erreur : </dt> ';
316
				$retour .= '<dd> '.$message.'</dd>'."\n";
317
 
318
				if (!is_null($requete)) {
319
					$retour .= '<dt> Requete : </dt> ';
320
					$retour .= '<dd> '.$requete.' </dd>'."\n";
321
		    	}
322
 
323
				if (!is_null($autres)) {
324
					$retour .= '<dt> Autres infos : </dt> ';
325
					$retour .= '<dd> '.$autres.' </dd>'."\n";
326
				}
327
				$retour .= '</dl>'."\n";
328
				$retour .= '</div>'."\n";
329
				$retour .= '<!-- END sql -->'."\n";
330
		}
331
		return $retour;
332
	}
333
}
334
?>