FAQ PHPConsultez toutes les FAQ

Nombre d'auteurs : 68, nombre de questions : 580, dernière mise à jour : 29 juillet 2013 

 
OuvrirSommaireErreurs - exceptionsComment corriger les erreurs ?

Le message d'erreur :

 
Sélectionnez
Warning: Cannot modify header information - headers already sent by <br/>
(output started at fichierEnvoi.php:37) in script.php on line 16

Traduction : Vous avez tenté d'envoyer des en-têtes à la ligne 16 du fichier script.php. Hors ceux-ci ont déjà été envoyés par le fichier fichierEnvoi.php à la ligne 37

Quand vous affichez quelque chose, PHP envoie automatiquement les en-têtes HTTP qui contiennent, par exemple, le type de document envoyé (PHP indique le type "text/html" si rien n'est indiqué de particulier).
Dans certain cas, votre code a besoin d'envoyer des en-têtes personnalisés. Par exemple pour envoyer un document du type image ou pour faire une redirection (Comment faire une redirection ?). Pour cela, il ne faut pas que les en-têtes soient déjà envoyés sinon vous ne pouvez pas les modifier et vous recevrez le messages d'erreur "headers already sent ...".

En reprenant l'exemple du message d'erreur précédant, et pour résoudre le problème, il faut modifier le fichier fichierEnvoi.php à la ligne 37 pour déplacer ce qui produit l'envoi des en-têtes.

Voici une liste (non exhaustive) de ce qui cause l'envoi des en-têtes :

  • un "echo"
  • un affichage hors PHP (c'est à dire de l'HTML en dehors du code)
  • un ou plusieurs retours chariots avant la balise "<?php"
  • une fonction qui rencontre une erreur et affiche un message (par exemple l'utilisation de la fonction "mysql_connect" avec de mauvais paramètres)

Tout ceci ne doit pas être fait avant l'utilisation de fonctions qui modifient les en-têtes comme "header" ou "session_start" entre autres.

Créé le 30 août 2005  par BiD0uille, Beuss

Les "parse error" sont des erreurs de syntaxe. Ces erreurs sont celles rencontrées le plus frequement, mais grâce au gestionnaire d'erreur par défaut de PHP, il est facile de trouver le problème et de le corriger. En effet, le message d'erreur indique toujours dans quel fichier et à quel ligne se trouve le problème.
Étant donné que l'erreur "parse error" intervient au moment où le fichier est lu ligne par ligne, cela signifie que l'erreur se trouve obligatoirement sur la ligne indiquée ou avant. Le code suivant la ligne indiquée n'a pas encore été lu donc vous n'avez pas besoin de l'analyser. Cela ne veut pas dire que le reste du code ne contient pas d'erreur mais que l'erreur indiquée ne se corrige pas en modifiant la fin du code.

Le message d'erreur peut prendre plusieurs formes. Voici quelque exemples :

1)

 
Sélectionnez
Parse error: parse error, expecting `','' or `';'' in /var/www/html/bug.php on line 3

Ouvrons le fichier "bug.php"

 
Sélectionnez
  1. <?php 
  2. echo 'Hier'; 
  3. echo 'Aujourd'hui'; 
  4. ?> 

Nous voyons sur la ligne 3 qu'il y a un guillemet simple dans la chaîne ce qui fait que la chaîne est mal formée. Ce problème se resoud en mettant "\'" pour obtenir la chaine 'Aujourd\'hui'.
Vous trouverez des autres exemples de "parse error" avec le message "expecting ... " dans la question suivante :
Erreur lors de l'affichage d'un élément d'un tableau ou d'une propriété d'un objet

2)

 
Sélectionnez
Parse error: parse error, ... in /var/www/html/bug2.php on line 3

Le fichier bug2.php :

 
Sélectionnez
  1. <?php 
  2. echo 'Hier'; 
  3. echo 'Aujourd\'hui' 
  4. echo 'Demain' 
  5. ?> 

Cette fois ci, la ligne 3 n'a pas de problème donc comme indiqué précédemment, le problème doit se trouver avant dans le fichier. Nous voyons là qu'il manque un point-virgule à la fin de la ligne 4 et cela résoud le problème.

3)

 
Sélectionnez
Parse error: parse error in /var/www/html/bug3.php on line 11

Le fichier bug3.php :

 
Sélectionnez
  1. <?php 
  2.  
  3. for ($i = 1; $i < 20; $i++) { 
  4.     if (($i % 2) == 1) { 
  5.         echo "$i est impair<br/>"; 
  6.     } else { 
  7.         echo "$i est pair<br/>"; 
  8.     } 
  9. ?> 

Cette fois-ci, le débugage est plus compliqué. En effet, l'erreur se trouve à la dernière ligne du fichier et un coup d'oeil rapide indique que cette dernière ligne est correcte donc l'erreur peut se trouver n'importe où dans le fichier.
La plupart du temps, ce genre d'erreur est causé par une accolade qui a été ouverte mais pas fermée ou l'inverse. Dans ce cas le résolution du problème peut nécessiter l'utilisation d'un éditeur avec coloration du code et ainsi mettre en correspondance les différentes ouvertures et fermetures d'accolades. Dans notre exemple, il s'agit de l'accolade de fin du "for" qui a été ouverte mais pas refermée.

Mis à jour le 4 août 2008  par Forum PHP

L'erreur "Use of undefined constant PHP" se produit lorsqu'une constante n'a pas été initialisé ou quand une variable n'a pas été correctement déclarée.
Pour résoudre ce problème vous devez :

Exemple :

  • Dans le cas d'une variable : rajouter un $ devant le nom de la variable afin qu'elle ne soit plus considérée comme une constante PHP.
 
Sélectionnez
$mavariable = "Developpez.com";
echo $mavariable; //Affiche Developpez.com

Au lieu de :

 
Sélectionnez
mavariable = "Developpez.com";
echo mavariable; //Signale une erreur "Use of undefined constant PHP"
  • Dans le cas d'une constante : la déclarer à l'aide de la fonction define() afin de lui assigner une valeur.

Exemple :

 
Sélectionnez
define ("MACONSTANTE", "Developpez.com");
echo MACONSTANTE; //Affiche Developpez.com
Mis à jour le 4 août 2008  par Forum PHP, Kerod

L'erreur "supplied argument is not a valid MySQL result resource" se produit quand une fonction MySQL n'a pas de résultat MySQL valide fourni en argument. Regardons le message d'erreur suivant par exemple :

 
Sélectionnez
Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in /var/www/html/bugMySQL.php on line 10

Et voila le contenu du fichier "bugMySQL.php" :

 
Sélectionnez
  1. <?php 
  2.  
  3. $connexion = mysql_connect('localhost', 'root', ''); 
  4. mysql_select_db('test', $connexion); 
  5.  
  6. $requete = 'SELECT * FROM nomTable WHERE champ = '; 
  7. $resultat = mysql_query($requete, $connexion); 
  8.  
  9. while ($ligne = mysql_fetch_assoc($resultat)) { 
  10.     echo "{$ligne['champ']}<br/>"; 
  11. } 
  12.  
  13. ?> 

L'erreur est à la ligne 9. Il s'agit donc de "$resultat" qui ne contient pas un résultat valide ce qui veut dire que la requête exécutée sur la ligne 7 pose problème.
Pour savoir quel est le problème, il suffit d'utiliser la fonction "mysql_error" qui retourne le message d'erreur fourni par le serveur MySQL. Cette fonction peut-être utilisée à n'importe quel étape de l'utilisation de MySQL, donc voila le code à utiliser pour gérer les erreurs.

 
Sélectionnez
<?php

$connexion = mysql_connect('localhost', 'root', '') or exit(mysql_error());
mysql_select_db('test', $connexion) or exit(mysql_error());

$requete = 'SELECT * FROM nomTable WHERE champ = ';
$resultat = mysql_query($requete, $connexion) or exit(mysql_error() . "<br/>$requete");

while ($ligne = mysql_fetch_assoc($resultat)) {
    echo "{$ligne['champ']}<br/>";
}

?>

En lançant ce code, le résultat suivant est obtenu :

 
Sélectionnez
You have an error in your SQL syntax near '' at line 1
SELECT * FROM nomTable WHERE champ = 

À l'aide du message d'erreur de MySQL, il est maintenant facile de corriger la requête. Attention, "line 1" qui apparait dans la message ne veut pas dire qu'il y a un problème sur la première ligne du fichier PHP mais sur la première ligne de la requête.

L'utilisation de ce code est très utile pour gérer les erreurs de MySQL, c'est pourquoi il est conseillé de mettre ce code dès qu'on commence à programmer. Ainsi en cas de problème, le message d'erreur fourni par MySQL apparaît immédiatement et dans le cas où il n'y a pas de problème, le code peut être laissé, il ne gênera pas le reste du code PHP.

Mis à jour le 4 août 2008  par Forum PHP
 
Sélectionnez
Warning: failed to open stream: Permission denied in 
/home/httpd/vhosts/essais.com/httpdocs/boutique/include/admin/common.inc.php on line 14

Lorsque vous obtenez ce message, cela veut tout simplement dire que vous avez pas les droits d'accès en lecture/écriture/exploration. Dans ce cas vous devez accéder, grâce à un client FTP, à votre dossier et modifier le chmod en lui attribuant la valeur 777.

Créé le 8 août 2006  par Forum PHP

Dans le cas d'une utilisation de la structure de contrôle foreach il se peut que l'on obtienne l'erreur :

 
Sélectionnez
Warning: Invalid argument supplied for foreach() in ...

foreach() est une fonction qui permet de passer en revue un tableau
Cette erreur apparait lorsque vous utilisez foreach() dont le premier paramètre n'est pas d'un tableau.

Mis à jour le 11 novembre 2008  par Forum PHP, Kerod

Comme précisé dans la documentation officielle, isset() fonctionne uniquement avec les variables.
Pour les constantes, il faut utiliser define().

Et pour les variables "magiques" (ie: gérée avec les fonctions magiques __set et __get), il faut définir la méthode __isset qui sera automatiquement appelée via la fonction isset.

Exemple
Sélectionnez

class Foo
{
  private $vars = array ();
 
  private function __set ($key, $value)
  {
    $this->vars[$key] = $value;
  }
 
  public function __get ($key)
  {
    return $this->vars[$key];
  }
 
  public function __isset ($key)
  {
    return isset ($this->vars[$key]);
  }
}
 
$foo = new Foo ();
isset ($foo->bar); // Retourne false
$foo->bar = 'bar';
isset ($foo->bar); // Retourne true
Créé le 11 novembre 2008  par Nicolas Joseph
  

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2003 Developpez.com Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.