Aller au menu - Aller au contenu

Icône Au secours ! Mon script plante !

Mise à jour : 03/04/2010
Difficulté : Facile Facile Creative Commons BY-NC-SA
133 390 visites depuis 7 jours, dont 299 sur ce chapitre classé 2/786
Alors comme ça votre script ne marche pas, et PHP vous affiche des erreurs incompréhensibles ?
Aucun souci à vous faire : c'est tout à fait normal, on ne réussit jamais un script du premier coup (en tout cas, moi jamais !).

Des milliers de messages d'erreur différents peuvent survenir (ok, jusque-là rien de très rassurant), et je n'ai pas vraiment la possibilité de vous faire la liste complète... mais je peux vous présenter les erreurs les plus courantes, ce qui devrait résoudre la grande majorité de vos problèmes. :)
Sommaire du chapitre :
Icône du chapitre
Chapitre précédent Sommaire Chapitre suivant

Les erreurs les plus courantes

Je pense qu'il est facile de parler d'erreurs "courantes", car vous verrez que certaines erreurs reviennent plus souvent que d'autres.

Nous allons passer en revue les erreurs suivantes :
  • 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 que vous obtenez ressemble à celui-ci :

Code : Autre
1
Parse error: parse error in fichier.php on line 15


Ce message vous indique une erreur dans fichier.php à la ligne 15. Généralement, cela veut dire que votre problème se situe à la ligne 15, mais ce n'est pas toujours le cas (trop facile sinon ^^ ). Parfois c'est la ligne précédente qui a un problème, pensez donc à regarder autour de la ligne indiquée.

Avec un éditeur de texte spécialisé comme Notepad++, vous avez les numéros de ligne sur votre gauche comme ceci :

Numérotation des lignes dans Notepad++


Bon, concrètement qu'est-ce qu'un parse error ? Un "parse error" est en fait une instruction PHP mal formée. Il peut y avoir plusieurs causes :
  • Vous avez oublié le point-virgule à la fin de l'instruction. Comme toutes les instructions doivent se terminer par un point-virgule, si vous oubliez d'en mettre un ça provoquera un "parse error". Par exemple :
    Code : PHP
    1
    $id_news = 5
    

    ... génèrera un parse error. Si vous mettez le point-virgule à la fin, tout rentrera dans l'ordre !
    Code : PHP
    1
    $id_news = 5;
    
  • Vous avez oublié de fermer un guillemet (ou une apostrophe, ou une parenthèse). Par exemple :
    Code : PHP
    1
    echo "Bonjour !;
    

    ... il suffit de fermer correctement les guillemets et vous n'aurez plus de problème :)
    Code : PHP
    1
    echo "Bonjour !";
    
  • Vous vous êtes trompé dans la concaténation, vous avez peut-être oublié un point :
    Code : PHP
    1
    echo "J'ai " . $age " ans";
    

    Une fois corrigé, ça donne :
    Code : PHP
    1
    echo "J'ai " . $age . " ans";
    
  • Il peut aussi s'agir d'une accolade mal fermée (pour un if par exemple). Vérifiez si vous fermez correctement toutes vos accolades. Si vous oubliez d'en fermer une, il est probable que le parse error vous indique que l'erreur se trouve à la dernière ligne du fichier (c'est-à-dire à la ligne 115 si votre fichier comporte 115 lignes).
    Donc, si on vous indique une erreur à la dernière ligne, il va probablement falloir relire tout le fichier PHP à la recherche d'une accolade mal fermée !

Si on vous dit que l'erreur est à la ligne 15 et que vous ne voyez vraiment pas d'erreur à cette ligne, n'hésitez pas à chercher l'erreur à la ligne juste au-dessus, elle s'y trouve peut-être !

Undefined function



Une autre erreur assez classique : la fonction inconnue. Vous obtenez ce message d'erreur :

Code : Autre
1
Fatal Error: Call to undefined function: fonction_inconnue() in fichier.php on line 27


Là, il faut comprendre que vous avez utilisé une fonction qui n'existe pas.

2 possibilités :
  • Soit la fonction n'existe vraiment pas. Vous avez probablement fait une faute de frappe, vérifiez si une fonction à l'orthographe similaire existe.
  • 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 que vous n'avez pas activée. Par exemple, si vous essayez d'utiliser la fonction imagepng alors que vous n'avez pas activé la bibliothèque GD pour les images en PHP, on vous dira que la fonction n'existe pas. Activez la bibliothèque qui utilise la fonction et tout sera réglé. :)

Une dernière chose : il se peut aussi que vous essayiez d'utiliser une fonction qui n'est pas disponible dans la version de PHP que vous avez.
Vérifiez dans le manuel dans quelles versions de PHP cette fonction est disponible.

Wrong parameter count



Si vous utilisez mal une fonction, vous aurez cette erreur :

Code : Autre
1
Warning: Wrong parameter count for fonction() in fichier.php on line 112


Cela signifie que vous avez oublié des paramètres pour la fonction, ou même que vous en avez mis trop.
Comme je vous l'ai appris dans le chapitre sur la doc PHP, consultez le mode d'emploi de la fonction pour savoir combien de paramètres elle prend et lesquels sont facultatifs.

Par exemple, la fonction fopen requiert au minimum 2 paramètres : le premier pour le nom du fichier à ouvrir et le second pour le mode d'ouverture (en lecture seule, écriture etc...). Si vous ne mettez que le nom du fichier à ouvrir comme ceci :

Code : PHP
1
$fichier = fopen("fichier.txt");


... vous aurez l'erreur "Wrong parameter count". Pensez donc à rajouter le paramètre qui manque, par exemple comme ceci :

Code : PHP
1
$fichier = fopen("fichier.txt", "r");


Dans les versions actuelles de PHP, on vous dit même le nombre de paramètres que vous avez oublié dans le message d'erreur !

Traiter les erreurs SQL

Comme vous le savez, 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 votre requête soit mal écrite, que le nom de la table que vous voulez ouvrir n'existe pas, etc. Bref, les erreurs possibles sont là encore nombreuses.

Toutefois, ce n'est pas MySQL qui vous 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 :
  1. Comment repérer une erreur SQL en PHP
  2. Comment faire parler PHP pour qu'il nous donne l'erreur SQL (de gré, ou de force !)


Repérer l'erreur SQL en PHP


Lorsqu'il s'est produit une erreur SQL, la page affiche le plus souvent l'erreur suivante :

Fatal error: Call to a member function fetch() on a non-object

Cette erreur survient lorsque vous voulez afficher les résultats de votre requête, généralement dans la boucle while ($donnees = $reponse->fetch())

Quand vous avez cette erreur, il ne faut pas chercher plus loin, c'est la requête SQL qui précède qui n'a pas fonctionné. Il vous manque cependant des détails sur ce qui a posé problème dans la requête. Nous allons 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. Je vous avais d'ailleurs présenté cette méthode dans un des premiers chapitres sur MySQL.

Vous devez utiliser un bloc try/catch autour de votre code qui fait appel à la base de données, sur ce modèle-ci :

Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
<?php
try
{
    $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
    $bdd = new PDO('mysql:host=localhost;dbname=test', 'root', '', $pdo_options);
    
    // Insérez ici toutes vos requêtes SQL
    
}
catch(Exception $e)
{
    die('Erreur : '.$e->getMessage()); // Affichage des erreurs éventuelles
}
?>


Si vous respectez bien ce canevas de code, toute erreur qui se produira à l'intérieur du bloc try provoquera l'appel du bloc catch... qui se charge d'afficher l'erreur SQL.

Si la requête marche, aucune erreur ne sera affichée et le contenu du bloc catch ne sera jamais appelé. Si la requête plante en revanche, PHP arrêtera de générer la page et vous affichera l'erreur donnée par MySQL...

A partir de là, il va falloir vous débrouiller tous seuls, car les erreurs SQL sont assez nombreuses et je ne peux pas toutes les lister. ^^

En général, MySQL vous dit "You have an error in your SQL syntax near 'XXX'". A vous de bien relire votre requête SQL, l'erreur se trouve généralement près de l'endroit où on vous l'indique.

Quelques erreurs plus rares

Les erreurs PHP sont très variées, et je ne parle même pas des erreurs SQL. N'espérez pas donc que je vous fasse ici la liste des 3946 erreurs de PHP, j'en serais incapable (je ne les ai pas encore toutes eues, mais ça ne saurait tarder à l'allure où je vais :p ).

Je vais vous montrer quelques erreurs un peu plus rares que "parse error", mais que vous rencontrerez probablement un jour. Si déjà je peux vous aider pour ces erreurs-là, ça sera bien. :)

Nous allons voir les erreurs :
  • 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 :

Code : Autre
1
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 effectuées 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 session_start() et de setcookie().


Ce que vous devez 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...".

Un exemple de code qui génère l'erreur :

Code : PHP
1
2
<html>
<?php session_start(); ?>


Ici, j'ai eu le malheur de mettre un peu de code HTML avant le session_start(), et c'est ce qui a provoqué l'erreur. Mettez le session_start() en tout premier, et vous n'aurez plus de problème :

Code : PHP
1
2
<?php session_start(); ?>
<html>


L'image contient des erreurs



C'est le navigateur qui vous donne ce message d'erreur et non pas PHP.
Ce message survient lorsque vous travaillez avec la bibliothèque GD. Si vous avez fait une erreur dans votre 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.

Bon d'accord, l'erreur est dans l'image. Mais comment faire pour faire "apparaître" l'erreur ?


2 possibilités :
  • Vous pouvez supprimer la ligne suivante dans votre code :
    Code : PHP
    1
    <?php header ("Content-type: image/png"); ?>
    

    L'erreur apparaîtra à la place du message "L'image contient des erreurs".
  • Vous pouvez aussi afficher le code source de l'image (comme si vous alliez regarder la source HTML de la page, sauf que là il s'agit d'une image).

Dans les deux cas, vous verrez le message d'erreur apparaître. A partir de là, il ne vous 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 :

Code : Autre
1
Fatal error: Maximum execution time exceeded in fichier.php on line 57


Imaginez que vous fassiez une boucle while, mais que celle-ci ne s'arrête jamais : votre 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 votre site inacessible !

Voici un exemple de boucle while qui ne s'arrêtera jamais :

Code : PHP
1
2
3
4
5
6
7
<?php
$nombre = 5;
while ($nombre == 5)
{
    echo 'Zéro ';
}
?>


Comme vous pouvez le voir, un tel code PHP ne s'arrêtera jamais parce que $nombre vaut TOUJOURS 5...

Si vous avez donc l'erreur "Maximum execution time exceeded", il va falloir repérer une boucle qui ne s'arrête jamais, car c'est elle qui provoque ce problème.

Rassurez-vous : la limite est fixée à 30s, mais vous n'y serez jamais confronté. En général, un serveur met moins de 50 millisecondes à charger une page PHP (on est très loin des 30 secondes !).
Cette annexe touche à sa fin, j'espère que les informations que vous y aurez déniché vous auront aidé à résoudre vos problèmes.
Quoiqu'il en soit, n'oubliez pas que chaque problème est particulier. Un peu de persévérance et on finit toujours par trouver le bug.

Enfin, si vous n'y arrivez vraiment pas, ne baissez pas les bras pour autant et allez poser votre question sur les forums du site. Un Zéro un peu plus expérimenté verra probablement votre erreur au premier coup d'oeil. ;)
Chapitre précédent Sommaire Chapitre suivant

Partager

22 commentaires pour "Au secours ! Mon script plante !"
Note moyenne : 3.61 / 4 (2518 votes)
Pseudo Commentaire
Hors ligne cytram # Posté le 04/07/2010 à 16:11:03
Avatar

Avis : Très bon

trouvez moi une aide pour ce code pas d'aide nul part ,même les membres ne savent pas corrigez :euh:

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /home/a3623222/public_html/conectes.php on line 13
Hors ligne Alexan # Posté le 06/10/2010 à 15:35:14

Parse error: syntax error, unexpected T_VARIABLE, expecting
Comment faire ?
Hors ligne Th30 # Posté le 10/03/2011 à 22:21:37
Il n'y a rien écrit ici
Avatar

Avis : Très bon

Pour les autres sites, pourquoi sa ne fait pas le problème quand on met du html avant session_start() ???
Hors ligne le hollandais volant # Posté le 10/08/2011 à 20:36:02
Pokémon for ever…
Avatar
Flux RSS

Études : Université Blaise Pascal Clermont-Ferrand

Petite idée pour cette partie du tuto : pourquoi ne pas y ajouter un petit paragraphe sur "la gestion des erreurs" ?

Avec les "error_reporting()" et tout ça ? Pour qu'on sache les activer sur sa machine de dev et les masquer sur son site de prod.

:pirate: Le Hollandais Volant :pirate: , pour vous servir je peux me resservir ? :p
 
Hors ligne spider17 # Posté le 05/03/2012 à 17:19:42
Fasciné par le sdz
Avatar

Citation : Alexan
Parse error: syntax error, unexpected T_VARIABLE, expecting
Comment faire ?


Salut

je n'ai pas tous lu, peut être qu'on a résolue ton problème enfin bon voila la solution cette erreur veut dire qu'il manque un point virgule a une instruction qui se trouve avant la ligne dont le débogueur PHP fait référence ;)

j’espère t'avoir aidé ^^

Je rêve de travailler dans une équipe de développeur, mes compétences:
php/mysql --> 80%; javascript --> 70%; ajax/jquery --> 50%; java --> 50%; jsp --> 20%; html5/css3 -->
80%; POO --> 35%; Symfony --> 35%; Androïd --> 20%;
les sites que j'ai conçu et que j'ai pas encore terminé :p
http://www.yousslam.kegtux.org
http://www.t-chat.biz
 

Voir tous les commentaires