Quand un script ne marche pas, PHP affiche des erreurs incompréhensibles (ce qui n'est pas rare !)
On va passer en revue les erreurs les plus courantes, on verra
pourquoi ça plante et puis
comment régler le problème.
Sommaire
Les erreurs les plus courantes
On va voir les erreurs suivantes, qui sont assez courantes :
- Parse error
- Undefined function
- Wrong parameter count
Parse error
Si on devait dire qu'il existe UNE erreur de base, ça serait très certainement celle-là. Impossible de programmer en PHP sans y avoir droit un jour.
Le message d'erreur qu'on obtient ressemble à celui-ci :
Parse error: parse error in fichier.php on line 15
Ce message indique une erreur dans fichier.php à la ligne 15. Généralement, cela veut dire que le problème se situe à la ligne 15, mais
ce n'est pas toujours le cas
 |
Si on écrit son code PHP sous bloc-notes, faire "Affichage / Barre d'état". Une barre d'état apparaîtra en bas de la fenêtre, en nous indiquant à quelle ligne se trouve notre curseur.
Le mieux reste quand même d'utiliser un éditeur spécialisé, comme Notepad++, qui affiche les numéros des lignes. |
Concrètement qu'est-ce qu'un parse error ?
Un "parse error" est en fait une instruction PHP pas correctement écrite. Plusieurs choses peuvent causer cela :
- On a oublié le point-virgule à la fin de l'instruction. Comme toutes les instructions doivent se terminer par un point-virgule. Il suffit de le rajouter pour que tout rentre dans l'ordre.
- Oublier de fermer un guillemet (ou une apostrophe, ou une parenthèse)
- Se tromper dans la concaténation, comme par exemple oublier un point (echo "J'ai " . $age " ans"; au lieu de echo "J'ai " . $age . " ans";)
- Accolade mal fermée. Dans ce cas parse error indique que l'erreur se trouve à la dernière ligne du fichier. Donc, si on nous indique une erreur à la dernière ligne, il va problablement relire tout le fichier à la recherche d'une accolade mal fermée !
Si on nous dit que l'erreur est à la ligne 15 et qu'on ne voit vraiment pas d'erreur à cette ligne, ne pas hésiter à chercher l'erreur à la ligne juste au-dessus, elle s'y trouve peut-être !
Undefined function
Autre erreur assez classique : la fonction inconnue. On obtient ce message d'erreur :
Fatal Error: Call to undefined function: fonction_inconnue() in fichier.php on line 27
Là, il faut comprendre qu'on a utilisé une fonction qui n'existe pas.
2 possibilités :
- Soit la fonction n'existe vraiment pas. On a probablement fait une faute de frappe, vérifier si une fonction à l'orthographe similaire existe.
Une erreur qui arrive souvent, c'est de taper html_entities au lieu de htmlentities (le vrai nom de la fonction).
- Autre cas possible : la fonction existe vraiment, mais PHP ne la reconnaît pas. C'est parce que cette fonction se trouve dans une extension de PHP qu'on n'a pas activée. Par exemple, si on essaie d'utiliser la fonction imagepng() alors qu'on n'a pas activé la librairie GD pour les images en PHP, on nous dira que la fonction n'existe pas.
Activer la librairie qui utilise la fonction et tout sera réglé.
Une dernière chose : il se peut aussi qu'on essaie d'utiliser une fonction qui n'est pas disponible dans la version de PHP qu'on a.
Vérifier dans le manuel (comme on l'a vu dans l'annexe sur la doc) dans quelles versions de PHP cette fonction est disponible.
Wrong parameter count
Si on utilise mal une fonction, vous aura cette erreur :
Warning: Wrong parameter count for fonction() in fichier.php on line 112
Cela signifie qu'on a oublié des paramètres pour la fonction, ou alors qu'on en a trop mis.
Là encore, comme on l'a vu dans le chapitre sur la doc PHP,
consulter le mode d'emploi de la fonction pour savoir combien de paramètres elle prend, et lesquels sont facultatifs.
 |
Dans les versions les plus récentes de PHP, on nous dit même le nombre de paramètres qu'on a oublié dans le message d'erreur ! |
Traiter les erreurs SQL
Comme on l'a vu, le langage SQL est un langage à part entière dont on se sert en PHP. S'il peut y avoir des erreurs en PHP, il peut aussi y avoir des erreurs en SQL !
Il se peut par exemple que notre requête soit mal écrite, que le nom de la table qu'on veut ouvrir n'existe pas etc etc… Bref, les erreurs possibles sont là encore nombreuses.
Toutefois, ce n'est pas MySQL qui nous dira qu'il y a une erreur, mais PHP. Et PHP n'est pas très bavard en ce qui concerne les erreurs SQL. Nous allons donc voir :
- Comment repérer une erreur SQL en PHP
- Comment faire parler PHP pour qu'il nous donne l'erreur SQL (de gré, ou de force :p)
Repérer l'erreur SQL en PHP
Lorsqu'il s'est produit une erreur SQL, cela peut se manifester en PHP de plusieurs manières :
- mysql_connect(): Access denied for user: 'sdz@localhost' (Using password: YES) in fichier.php on line 196
Là, on s'est trompé de mot de passe ou de nom d'utilisateur en utilisant la fonction mysql_connect. Vérifier auprès de son hébergeur si le mot de passe est le bon. Si on utilise WAMP, se rappeller que le nom d'utilisateur est "root", et qu'il n'y a pas de mot de passe.
- mysql_fetch_array(): supplied argument is not a valid MySQL result resource
Cette erreur survient lorsqu'on veut afficher les résultats de sa requête, généralement dans la boucle "while ($donnees = mysql_fetch_array($retour))"
Alors là, y'a pas 36 explications possibles : c'est tout simplement que notre requête SQL a foiré.
Si on a donc l'erreur sur
mysql_fetch_array(), on sait que la requête n'a pas marché, mais on n'a pas l'erreur qui nous dit ce qu'il s'est passé.
On va maintenant voir comment on peut remédier à cela.
Allez ! Crache le morceau !
Comme visiblement PHP n'a pas envie de nous donner l'erreur renvoyée par MySQL, on va le lui demander d'une autre manière.
C'est très facile à faire, mais on ne peut pas deviner tout seul.
Repérer la requête qui foire selon nous (certainement celle juste avant le mysql_fetch_array), et demander d'afficher l'erreur s'il y en a une, comme ceci :
mysql_query("SELECT * FROM table")
die(mysql_error());
Si la requête marche, aucune erreur ne sera affichée.
Si la requête plante, PHP arrêtera de générer la page et nous affichera l'erreur donnée par MySQL…
A partir de là, il va falloir se débrouiller tout seul, car les erreurs SQL sont assez nombreuses et on ne peut pas toutes les lister.
En général, MySQL nous dit "You have an error in your SQL syntax near 'truc'". A nous de bien relire notre requête SQL, l'erreur se trouve généralement près de l'endroit où on nous l'indique.
Quelques erreurs plus rares
Les erreurs PHP sont très variées, sans parler des erreurs SQL. Ne pas compter qu'on nous fasse ici la liste des 3946 erreurs de PHP, c'est impossible.
On va quand même voir quelques erreurs un peu plus rares que "parse error", mais qu'on rencontrera probablement un jour :
- Headers already sent by…
- "L'image contient des erreurs"
- Maximum execution time exceeded
Headers already sent by…
Voilà une erreur classique quand on travaille avec les sessions ou avec les cookies :
Cannot modify header information - headers already sent by …
Que doit-on comprendre par là ?
Les
headers sont des informations d'en-tête qui sont envoyées avant toute chose au navigateur du visiteur. Elles permettent de dire "Ce que tu vas recevoir est une page HTML", ou "Ce que tu vas recevoir est une image PNG", ou encore : "Inscris un cookie".
Toutes ces choses-là doivent être dites avant que le moindre code HTML ne soit envoyé. En PHP, la fonction qui permet d'envoyer des informations de headers s'appelle
header(). On s'en est notamment servi dans le chapitre sur la librairie GD pour indiquer que l'on envoyait une image et non pas une page HTML.
 |
Il y a d'autres fonctions qui envoient toutes seules des headers. C'est le cas de . |
Ce qu'on doit retenir, c'est que chacune des ces fonctions doit être
utilisée au tout début de votre code PHP. Il ne faut RIEN mettre avant, sinon ça provoquera l'erreur "Headers already sent by…".
Exemple de code qui génère l'erreur :
<html>
<? session_start(); ?>
On a mis un peu de code HTML avant le
session_start(), et ça a provoqué l'erreur. Mettre
session_start() en tout premier pour être tranquille :
<? session_start(); ?>
<html>
L'image contient des erreurs
C'est le navigateur qui nous donne ce message d'erreur et non pas PHP.
Ce message survient lorsqu'
on travaille avec la librairie GD. Si on a fait une erreur dans notre code (par exemple un banal "parse error"), cette erreur sera
inscrite dans l'image. Du coup, l'image ne sera pas valide et le navigateur ne pourra pas l'afficher.
 |
L'erreur est dans l'image. Mais comment faire pour faire "apparaître" l'erreur ? |
2 possibilités :
- On peut supprimer la ligne :
header ("Content-type: image/png");
L'erreur apparaîtra à la place du message "L'image contient des erreurs".
- On peut aussi faire "Bouton droit / Afficher la source " (comme si on allait regarder la source HTML de la page, sauf que là il s'agit d'une image).
Dans les deux cas, on verra le message d'erreur apparaître. A partir de là, il ne nous restera plus qu'à corriger le bug !
Maximum execution time exceeded
Ca c'est le genre d'erreur qui arrive le plus souvent à cause d'une boucle interminable :
Fatal error: Maximum execution time exceeded in fichier.php on line 57
Imaginons qu'on fasse une boucle while, mais que celle-ci ne s'arrête jamais : notre script PHP va tourner en boucle tout le temps sans jamais s'arrêter.
Heureusement, PHP limite le temps d'exécution d'une page PHP à 30 secondes par défaut. Si une page met plus de 30s à se générer, PHP arrête tout en disant que c'est trop long. Et il fait bien, parce que sinon cela pourrait ralentir tout le serveur et rendre notre site inacessible !
Un exemple de boucle while qui ne s'arrêtera jamais :
Code PHP
$nombre = 5;
while ($nombre ==5)
{
echo 'Zér0 ';
}
un tel code PHP ne s'arrêtera jamais parce que $nombre vaut TOUJOURS 5…
Si on a donc l'erreur "Maximum execution time exceeded", il faut repérer une boucle qui ne s'arrête jamais, c'est elle qui provoque ce problème.
Se rassurer : la limite est fixée à 30s, mais on n'y sera jamais confronté. En général, une bonne page PHP met environ 50 millisecondes à se charger (on est très loin des 30 secondes !).