Les erreurs (e_all, e_warning, e_error)
Détection d'erreur en PHP
On défini comme étant une erreur, une anomalie au niveau de l'application. On peut donc dire qu'il y a une erreur si le programme ne fonctionne pas comme il a été conçu.
Pendant le développement, une erreur peut provenir par exemple du non respect de la syntaxe du langage, d'une mauvaise configuration, etc.
Elle peut aussi être une erreur au niveau de l'algorithme lui-même. Ainsi, notre code peut générer par exemple des prix de valeur négative ou quelque chose de ce genre. Ce qui nous pousse à faire très attention pendant la phase de conception.
De la détection des erreurs (afin de nous informer de leurs existences), et de l'information à la correction de ces erreurs, Php nous offre la possibilité de mieux gérer ces erreurs.
Interprétation d'un message d'erreur
Lorsque PHP détecte des erreurs, des messages explicatifs seront affichés pour les intercepter. Il nous donne notamment des informations sur le niveau d'importance de l'erreur, sur l'emplacement où elle a été détectée (nom du script et numéro de ligne).
Exemple 1
Code dans fichier.php
<?php include("test.php"); echo 'Le script continue'; ?>
Affichage à l'écran :
Warning: include(test.php) [function.include]: failed to open stream: No such file or directory in C:wampwwwTESTTUTOerreur.php on line 2
Warning: include() [function.include]: Failed opening 'test.php' for inclusion (include_path='.;C:php5pear') in C:wampwwwTESTTUTOerreur.php on line 2
Le script continue :
Exemple 2
<?php require("test.php"); echo 'Le script continue'; ?>
Affichage à l'écran
Warning: require(test.php) [function.require]: failed to open stream: No such file or directory in C:wampwwwTESTTUTOerreur.php on line 2
Fatal error: require() [function.require]: Failed opening required 'test.php' (include_path='.;C:php5pear') in C:wampwwwTESTTUTOerreur.php on line 2
Ces messages d'erreurs proviennent de l'absence du fichier test.php. En effet, l'inclusion d'un fichier inexistant sur la ligne numéro 2 génère une erreur (No such file or directory in C:wampwwwTESTTUTOerreur.php on line 2).:
Les deux fonctions require et include permettent d'inclure un fichier dans un script. Le niveau d'affichage des erreurs différencie ces deux fonctions.
Dans l'exemple 1, avec un include, il n'y a que des warning à l'affichage, et le script continu à s'executer. C'est pourquoi, le texte s'affiche quand même en dessous : "Le script continue".:
Par contre dans l'exemple 2, avec la fonction require, on a un fatal error et l'exécution a été interrompue.
Il est donc important d'accorder un peu plus d'attention à ces différents niveaux d'erreur que l'on abordera par la suite.
A noter que le message d'erreurs est en général assez explicite sur le fichier et sur la ligne qui a généré l'erreur.
Les différents niveaux d'erreur
Le type d'une erreur est représenté par une constante PHP.
Message informatif (constante : E_NOTICE)
Ce type d'erreur ne s'affiche qu'à titre informatif, donc elle n'a pas beaucoup d'importance. On rencontre par exemple une erreur de ce type quand le script essaie d'accéder à une valeur qui n'a pas été déclarée, etc. L'erreur ne perturbe pas spécialement la suite du script, mais informe le développeur du problème survenu.
Message d'Alert (Constante : E_WARNING)
Comme l'on a vu dans les exemples ci-dessus, les avertissements ou warning n'interrompent pas l'exécution du script.
Elles indiquent simplement un problème qui a été intercepté par le script avant (exemple : appel de la fonction ereg() avec une expression invalide)
Erreurs critique (Constante : E_ERROR)
En cas d'erreur critique de type E_ERROR, l'exécution du script est interrompu. Il s'agit d'une erreur qui ne peut pas être ignorée et intervient par exemple quand une fonctionnalité importante ne peut pas s'exécuter.
Erreurs de syntaxe (Constante E_PARSE)
Lors d'un problème d'interprétation du script, PHP produit une erreur de type E_PARSE. C'est une erreur de syntaxe dans les fichiers que l'on désigne par parse error. Cette erreur empêche le parser php de lire le code, et de l'interpréter. Il peut s'agir par exemple de l'oubli d'un point virgule à la fin d'une instruction.
Erreurs internes de PHP (Constantes : E_CORE_ERROR et E_CORE_WARNING)
Les erreurs E_CORE_ERROR et E_CORE_WARNING sont similaires aux erreurs E_ERROR et E_WARNING, sauf qu'elles sont générées par le code de PHP. Autrement dit, ce sont des erreurs qui ne proviennent pas forcément de PHP mais de PHP lui-même. Les fonctions ne doivent pas générer ce genre d'erreur.
Erreurs de compilation (Constantes :E_COMPILE_ERROR et E_COMPILE_WARNING)
Ce sont également des erreurs internes de PHP. Elles sont générées au moment de la compilation en byte code de l'application. Ces erreurs sont similaires à E_ERROR et E_WARNING, sauf qu'elles sont générées par Zend Scripting Engine.
Erreurs Utilisateur (E_USER_ERROR, E_WARNING, E_NOTICE)
Ces erreur sont comparable à E_ERROR, E_WARNING, E_NOTICE mais elles provienne de notre script. L'utilisation de la fonction trigger_error() permet de la traiter.
E_ALL
L'utilisation de ce niveau de rapport d'erreur provoque l'affichage de toutes des erreurs
Configuration de l'affichage des erreurs
Afficher ou ne pas afficher les erreurs
Pendant la période de développement, il est fortement utile d'afficher les messages d'erreurs pour pouvoir les détecter et les corriger. Par contre pour un site en production, si on affiche les messages d'erreur, on risque de révéler une bonne partie du secret de notre script. Et les utilisateurs de l'application se trouveront bien embêtés.
Pour éviter ce genre de problème, une petite manipulation dans le fichier php.ini permet de configurer l'affichage des messages d'erreurs. On met la directive display_errors pour dire qu'on affiche les erreurs et on met la directive à off pour désactiver l'affichage... sachant que sa valeur par défaut est on.
Cependant, il nous faut toujours un moyen de connaitre les éventuels problèmes de notre script. Même si on n'affiche pas les erreurs, il est possible de les connaitre en utilisant un fichier log.
On pourra donc avoir une configuration de ce type dans php.ini : display _errors
display _errors = on
log_errors = on
error_log = /repertoire/fichierlog.txt
Filtrer les erreurs : error_reporting
De la même façon on peut aussi filtrer les erreurs en fonction de leur niveau en n'affichant que les erreurs utiles. Comme l'on avait vu plus haut, chacune des constantes de type d'erreur (comme E_ERROR, etc. ) présente un niveau d'erreur.
Si l'on veut par exemple afficher toutes les erreurs, on met :
error_reporting= E_ALL
Si l'on veut afficher toutes les erreurs sauf les warning, on met :
error_reporting = E_ALL & ~ E_WARNING
On peut aussi faire la même chose mais cette fois ci dans le script, en appelant directement la fonction error_reporting() comme suit :
error_reporting(E_ALL) ;