FAQ PHP
FAQ PHPConsultez toutes les FAQ
Nombre d'auteurs : 68, nombre de questions : 580, dernière mise à jour : 18 septembre 2021
- Explications et correction de l'erreur "headers already sent"
- Explications et correction de l'erreur "parse error"
- Explications et correction de l'erreur "Use of undefined constant PHP"
- Explications et correction de l'erreur "supplied argument is not a valid MySQL result resource"
- Explications et correction de l'erreur 'failed to open stream: Permission denied'
- Explication et correction de l'erreur 'Invalid argument supplied for foreach()'
- Pourquoi isset renvoie toujours false ?
Le message d'erreur :
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.
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)
Parse error: parse error, expecting `','' or `';'' in /var/www/html/bug.php on line 3
Ouvrons le fichier "bug.php"
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)
Parse error: parse error, ... in /var/www/html/bug2.php on line 3
Le fichier bug2.php :
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)
Parse error: parse error in /var/www/html/bug3.php on line 11
Le fichier bug3.php :
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.
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.
$mavariable
=
"
Developpez.com
"
;
echo $mavariable
;
//Affiche Developpez.com
Au lieu de :
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 :
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 :
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" :
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
<?php
$connexion
=
mysql_connect('localhost'
,
'root'
,
''
);
mysql_select_db('test'
,
$connexion
);
$requete
=
'SELECT * FROM nomTable WHERE champ = '
;
$resultat
=
mysql_query($requete
,
$connexion
);
while
($ligne
=
mysql_fetch_assoc($resultat
)) {
echo "
{
$ligne
[
'champ'
]
}
<br/>"
;
}
?>
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.
<?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 :
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.
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.
Dans le cas d'une utilisation de la structure de contrôle foreach il se peut que l'on obtienne l'erreur :
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.
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.
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