Vous êtes ici Codes PHP et MySQL > Applications > [PHP 4.0.7] Gérer les erreurs PHP et les notifier...

 

[PHP 4.0.7] Gérer les erreurs PHP et les notifier proprement à l'internaute

AVERTISSEMENT : malgré ce qui est dit ci-après, ce code n'est pas sémantique. Je le modifierai dès que possible.

Ce script est plutôt une méthode en fait. Il s'agit de gérer les erreurs, avertissements et informations que vous affichez à l'utilisateur.

Exemple : deux mots de passe qui ne correspondent pas, un compte dont les paramètres ont correctement édité...

Vous pouvez facilement rajouter des types de remarques (question, simple remarque, conseil...) et modifier l'affichage.

Le code comporte de nombreuses explications. Il est livré ici sous la forme d'un fichier HTML autonome de démonstration. Aller à la page de démonstration en ligne. Code source PHP de la page de démo.
 
poujolrost-mathias
Site de l'auteur voir
[14] sources en PHP voir
Code vu 9181 fois
Enregistré le 23 Jan 2009
  • Digg ce code sur digg.com
  • Bookmark ce code sur del.icio.us
  • Bookmark ce code sur Google
  • Bookmark ce code sur Yahoo
  • Ajoute [PHP 4.0.7] Gérer les erreurs PHP et les notifier proprement à l'internaute
  • Partage ce code sur Facebook
 
 
 
 

Code Source


01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
308.
309.
310.
311.
312.
313.
314.
315.
316.
317.
318.
319.
320.
321.
322.
323.
324.
325.
326.
327.
328.
329.
330.
331.
332.
333.
334.
335.
336.
337.
338.
339.
340.
341.
342.
343.
344.
345.
346.
 
<?php
/******************************************************************************/
/*                                                                            */
/*                       __        ____                                       */
/*                 ___  / /  ___  / __/__  __ _____________ ___               */
/*                / _ \/ _ \/ _ \_\ \/ _ \/ // / __/ __/ -_|_-<               */
/*               / .__/_//_/ .__/___/\___/\_,_/_/  \__/\__/___/               */
/*              /_/       /_/                                                 */
/*                                                                            */
/*                                                                            */
/******************************************************************************/
/*                                                                            */
/* Titre          : [PHP 4.0.7] Gérer les erreurs PHP et les notifier...      */
/*                                                                            */
/* URL            : http://www.phpsources.org/scripts490-PHP.htm              */
/* Auteur         : poujolrost-mathias                                        */
/* Date édition   : 23 Jan 2009                                               */
/* Website auteur : http://site.mathiaspoujolrost.net/competences/            */
/*                                                                            */
/******************************************************************************/
 

/* fonction pour afficher les erreurs, avertissement et informations (qui
 contiennent du balisage) */
/* renvoit true si au moins une remarque */
function afficherRemarques($tableau$type "information")
{ 
    if ("s" == substr($type, -1)) // si il a un "s" à la fin...
    {    $type substr($type0, -1);    } // ... on le coupe
    if ($type != "erreur" && $type != "avertissement" && $type != "information")
    {    $type "information";    }

    $nbr count($tableau);
    if ($nbr != 0) {$retour true;} // il y a au moins une remarque à afficher

    else {$retour false;}
    
    if ($nbr == 1)
    {
        echo "\n<dl class=\"$type\">\n\t<dt><strong>" .ucfirst($type). 
"</strong> :</dt>\n\t<dd>$tableau[0]</dd>\n</dl> <!-- FIN de la <dl" .
" class=\"$type\"> -->\n";
    }    
    elseif ($nbr 1)
    { 
        echo "\n<dl class=\"$type\">\n\t<dt><strong>" .ucfirst($type). 
"s ($nbr)</strong> :</dt>\n";
        foreach($tableau as $val)
        {
            echo "\t<dd>$val</dd>\n";
        }
        echo "</dl> <!-- FIN de la <dl class=\"$type\"> -->\n";
    }
    
    return $retour;
} // FIN  function afficherRemarques($tableau, $type)

/* fonction pour supprimer des éléments vides d'un tableau */
/* trouvée ici : http://www.jonasjohn.de/snippets/php/array-remove-empty.htm */
function suppVidesDansTableau($tab)
{
    $tabOK = array(); 
// le bon tableau (= sans élément vide), qui va être retourné
    while(list($cle$val) = each($tab)) 
// permet de passer en revue le tableau
    {
        if (is_array($val))
        {
            $val suppVidesDansTableau($val); // récursivement
            if (count($val) != 0// si tableau non vide
            {
                $tabOK[$cle] = $val// on le copie dans le bon tableau
            }
        }
        else 
        {
            if (trim($val) != ""// si valeur non vide
            {
                $tabOK[$cle] = $val;
            }
        }
    } // FIN du while
    unset($tab);
    return $tabOK;
} // FIN  function suppVidesDansTableau

/* fonction pour collecter toutes les remarques et les agréger dans leurs
 tableaux respectifs */
/* elle doit être utilisée sur chaque variable retournée par une autre fonction 
qui pourrait renvoyer des remarques (voir plus loin comment créer ces remarques)
 */
function rassemblerRemarques($tab, &$erreurs, &$avertissements, &$informations) 

{
    if ( !is_array($tab) ) {echo 
"<p class\"erreur\">La variable <var>\$tab</var>,dans laquelle vous cherchez" .
" des remarques, n'est pas un tableau.</p>";}
    
    if ( array_key_exists("erreurs"$tab) )
    {
        $err $tab['erreurs'];
        if ( is_array($err) )
        {
            foreach ($err as $val)
            {
                $erreurs[] = $val;
            }        
        }
        else {$erreurs[] = $err;}
        array_unique(suppVidesDansTableau($erreurs));
    }
        
    if ( array_key_exists("avertissements"$tab) )
    {
        $avert $tab['avertissements'];
        if ( is_array($avert) )
        {
            foreach ($avert as $val)
            {
                $avertissements[] = $val;
            }        
        }
        else {$avertissements[] = $avert;}
        array_unique(suppVidesDansTableau($avertissements));
    }
    
    if ( array_key_exists("informations"$tab) )
    {
        $info $tab['informations'];
        if ( is_array($info) )
        {
            foreach ($info as $val)
            {
                $informations[] = $val;
            }        
        }
        else {$informations[] = $info;}
        array_unique(suppVidesDansTableau($informations));
    }

    if ( !empty($tab['remarques']) )// récursivement 
    {
        $remarques $tab['remarques'];
        rassemblerRemarques($remarques$erreurs$avertissements$informations
); 
    }
} 
// FIN  function rassemblerRemarques($tab, &$erreurs, &$avertissements,
// &$informations)
// à utiliser toute seule (ne retourne rien) mais avec ses 4 arguments


/* une fonction bidon, juste pour montrer que si on veut retourner plusieurs
 valeurs, il faut un tableau */
/* le but est par après de récupérer ces valeurs de remarque (erreur,
 avertissement ou information) */
/* les erreurs sont en anglais pour bien les différencier de celles ajoutées
 hors fonctions */
/* les numéros associés indique la profondeur de laquelle elles ont été
 "extraites" */
function fonctionBidon()
{
    $retour = array(
            0                =>        0,
            "erreurs"        =>        
"<p>[en-1] This is an error extracted from a function.</p>",
            "bla bla"        =>        'un discours inutile',
            "informations"    =>        array(
"<p>[en-2] A piece of information got from an array.</p>"'<p>[en-2] Another piece of information extracted from an array.</p>'),
            9                =>         "un chiffre tout neuf",
            "remarques"        =>        array(
                                        "avertissements"     =>    array(
"<p>[en-3] An alarming warning.</p>""<p>[en-3] A second warning, deeply hidden.</p>"),
                                        "informations"         =>    
"<p>[en-3] A deep piece of information.</p>",
                                        "erreurs"            =>     
"<p>[en-3] One more error, this one was deeply hidden.</p>"
                                        ),
            'truc'            =>        'Non, non, rien en fait !'        
    );
    
    return $retour;
}
// attention ci-avant dans [remarques] : ne pas avoir plusieurs fois la même
// clé, sinon la valeur finale écrase les autres
// plusieurs possibilités pour la création des remarques dans la valeur
// retournée d'une fonction :
// soit vous créez une clé "erreurs|avertissments|informations" qui contient un
// élément ou tableau d'éléments
// (condition : n'avoir que ce type de remarques à renvoyer)
// soit vous créer une clé "remarques" qui contient un tableau de tableaus de
// remarques
// (un array par type de remarques, initialisé à vide)


/* une autre fonction bidon, juste pour exemple d'implantation */
/* les remarques de cet exemple sont en Allemand, pour les différencier */
function fonctionBidon2()
{ 
    /* multi-initialisation de la variable de retour */
    $retour = array(
                "retour"        =>        "",
                "remarques"        =>        array(
                                        "erreurs"            =>    array(""),
                                        "avertissement"        =>    array(""),
                                        "informations"        =>    array("")
                                        )
                );
                
    /* ici les instruction de la fonctions... */
    
    /* dès qu'il y a une remarque à créer, on l'"enregistre" comme suit : */
    $retour['avertissements'][] = "<p>[de] Achtung ! ! XD</p>"// si que des avertissements à renvoyer
    $retour['remarques']['informations'][] = 
"<p>[de] Ich bin ein Berliner !</p>"// méthode générale
            
    return $retour;
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Afficher les erreurs, avertissements et informations dans un &lt;dl&gt;
 (remarques balis&eacute;es)</title>
<style type="text/css">
.erreur {    border-color: red;    }
.avertissement {    border-color: orange;    }
.information {    border-color: green;    }
.erreur, .avertissement, .information { /* chaque dl */
    margin: 10px 0; /* top+bottom et right+left */
    border-width: 2px;
    border-style: solid;
    border-left-width: 15px;
    padding: 0 10px 0; /* top, right+left, bottom */
    background: white;
}
.erreur dt, 
.erreur dd, .avertissement dt, .avertissement dd, .information dt, .information
 dd { 
    margin: 1ex 0; /* marges verticales fusionnent */
    padding: 0;  
}
.erreur dd {    border-left-color: red;    }
.avertissement dd{    border-left-color: orange;    }
.information dd {    border-left-color: green;    }
.erreur dd, .avertissement dd, .information dd {
    border-left-width: 5px;
    border-left-style: solid;
    padding-left: 5px;
}
</style>
</head>

<body id="body">
<h1>Afficher des remarques à l'utilisateur : erreurs, avertissements et
 informations</h1>
<p>Les remarques sont balisées avec les balises <a
 href="http://giminik.developpez.com/xhtml/dl">&lt;dl&gt; (liste de définitions)
</a>, <a href="http://giminik.developpez.com/xhtml/dt">&lt;dt&gt; (terme
 défini)</a> et <a href="http://giminik.developpez.com/xh
tml/dd">&lt;dd&gt; (le corps de la définition)</a>. Le code est ainsi
 s&eacute;mantique et valide.</p>
<p>Modèle : </p>
<blockquote style="background: #BBB; padding: 1ex;" title="fond gris uniquement
 pour faire ressortir cet exemple">
<dl>
    <dt><strong>Nature de la remarque (nombre de remarques)</strong> :</dt>
    <dd><p>Une première remarque.</p></dd>
    <dd><p>Une autre remarque de même nature, on peut en avoir autant qu'on
 veut.</p></dd>
</dl>
</blockquote>
<p><a href="http://www.phpsources.org/scripts490-PHP.htm">Page d'explication sur
 ce bout de code PHP</a>.</p>
<p>Voici des exemples d'affichage de remarques : </p>
<?php
/* DEBUT exemples, les passer en commentaires pour voir comment s'affichent les
 remarques */
$erreurs[] = "<p>Vous n'avez rien tap&eacute; dans le champ de saisie.</p>";
//$erreurs[] = "<p>Vous devez valider la création de votre compte en cliquant
// sur le lien dans le courriel qui vient de vous être envoyé.</p>";

$avertissements[] = 
"<p>Vous devez valider la création de votre compte en cliquant sur le lien" .
" dans le courriel qui vient de vous être envoyé. Sinon, votre compte sera" .
" supprimé d'ici 5 jours.</p>";
//$avertissements[] = "<p>Votre texte semble très court.</p>";

$informations[] = "<p>Votre compte a bien été validé.</p>";
//$informations[] = "<p>Votre message a bien été envoyé.</p>";
/* FIN exemples ----- ----- ----- ----- ----- */

afficherRemarques($erreurs"erreur"); 
afficherRemarques($avertissements"avertissement");  
afficherRemarques($informations"information"); 

/* on considère maintenant la situation dans laquelle les remarques<br />
se produisent au sein d'une fonction
(donc a priori innacessible en dehors) */
echo "<hr />
<p>On fait tourner une fonction bidon qui ne fait qu'ajouter des remarques" .
" (en anglais), et on ré-affiche ces dernières.</p>";
$truc fonctionBidon();
rassemblerRemarques($truc$erreurs$avertissements$informations);

afficherRemarques($erreurs"erreur"); 
afficherRemarques($avertissements"avertissement");  
afficherRemarques($informations"information"); 

echo "<hr />
<p>On fait tourner une autre fonction bidon (qui retourne des remarques en" .
" Allemand) puis on ré-affiche les remarques.</p>";
rassemblerRemarques(fonctionBidon2(), $erreurs$avertissements$informations);

afficherRemarques($erreurs"erreur"); 
afficherRemarques($avertissements"avertissement");  
afficherRemarques($informations"information"); 

/* en situation réelle, utiliser plutôt les appels suivants (contrairement aux
 précédents) :  
*  on n'affiche des avertissements et informations que si il n'y a pas d'erreur
*  (enfin, ça c'est à vous de voir)

$existentErreurs = afficherRemarques($erreurs, "erreur"); 
if (!$existentErreurs)
{
    afficherRemarques($avertissements, "avertissement");
    afficherRemarques($informations, "information");
}

*/
?>
<p><a href="?source">Afficher le code source PHP de cette page</a>.</p>
<p><a href="http://jigsaw.w3.org/css-validator/check/referer"
 hreflang="mis">V&eacute;rifier la validité du code CSS</a>. <a href="http://val
idator.w3.org/check?uri=referer" hreflang="en">Vérifier la validité du code
 HTML</a>.</p>
<p><a href="#body">Retour en haut</a>.</p>
</body>
</html>
 

Fonctions du code

: Retourne un segment de chaîne - (PHP 4, PHP 5)
: Compte le nombre d'éléments d'un tableau ou le nombre de propriétés...
: Affiche une chaîne de caractères - (PHP 4, PHP 5)
: Met le premier caractère en majuscule - (PHP 4, PHP 5)
: Crée un tableau - (PHP 4, PHP 5)
: Retourne chaque paire clé/valeur d'un tableau - (PHP 4, PHP 5)
: Transforme une liste de variables en tableau - (PHP 4, PHP 5)
: Détermine si une variable est un tableau - (PHP 4, PHP 5)
: - (PHP 4, PHP 5)
: Détruit une variable - (PHP 4, PHP 5)
: Vérifie si une clé existe dans un tableau - (PHP 4 >= 4.0.7, PHP 5)
: Dédoublonne un tableau - (PHP 4 >= 4.0.1, PHP 5)
: Détermine si une variable contient une valeur non nulle - (PHP 4, PHP 5)
Commentaire
Remarque importante :
Ce bout de code n'est pas sémantique (enfin pas correct sur ce plan) : http://forum.alsacreations.com/topic-2-42847-1-Resolu-dl--meilleur-balisage-pour-les-remarques-a-lutilisateur-.html#p303927 .

Je le corrigerai dès que j'ai le temps.
 
Ajouter un commentaire
Code de sécurité

Attention: Les champs marqués d'une étoile * sont obligatoires
 
Librairie PHP

Connexion

 
 

Applications

 
 

PHP

 
 
 
 
    Offres d'emploi

Plus de 500 offres d'emploi PHP/MySQL

Offres d'emploi
 
    Editeur PHP
 
        Publicité