1251 votes

Référence - Que signifie cette erreur en PHP ?

Qu'est-ce que c'est ?

Il s'agit d'une série de réponses sur les avertissements, les erreurs et les notifications que vous pouvez rencontrer en programmant PHP et que vous ne savez pas comment résoudre. Il s'agit également d'un Wiki communautaire, donc tout le monde est invité à participer à l'ajout et à la maintenance de cette liste.

Comment cela se fait-il ?

Des questions telles que "Headers already sent" (En-têtes déjà envoyés) o "Appeler un membre d'un non-objet". apparaissent fréquemment sur Stack Overflow. La cause première de ces questions est toujours la même. Les réponses à ces questions les répètent donc généralement et indiquent ensuite à l'OP la ligne à modifier dans son cas particulier. Ces réponses n'apportent aucune valeur ajoutée au site car elles ne s'appliquent qu'au code particulier de l'utilisateur. Les autres utilisateurs qui rencontrent la même erreur ne peuvent pas facilement en tirer la solution parce qu'elles sont trop localisées. C'est dommage car une fois que l'on a compris la cause première, la correction de l'erreur est triviale. C'est pourquoi cette liste tente d'expliquer la solution d'une manière générale pour qu'elle puisse être appliquée.

Que dois-je faire ici ?

Si votre question a été marquée comme un doublon de celle-ci, veuillez trouver votre message d'erreur ci-dessous et appliquer la correction à votre code. Les réponses contiennent généralement des liens supplémentaires à explorer au cas où la réponse générale ne suffirait pas à éclaircir le problème.

Si vous souhaitez contribuer, veuillez ajouter votre message d'erreur, avertissement ou avis "préféré", un par réponse, une brève description de sa signification (même s'il ne s'agit que de mettre en évidence les termes vers leur page de manuel), une solution possible ou une approche de débogage et une liste des questions-réponses existantes qui sont utiles. N'hésitez pas non plus à améliorer les réponses existantes.

La liste

Voir aussi

8 votes

Par ailleurs, pour déplacer la discussion hors des commentaires, veuillez vous rendre à l'adresse suivante este question méta

298voto

Gordon Points 156415

Avertissement : Impossible de modifier les informations d'en-tête - les en-têtes ont déjà été envoyés

Se produit lorsque votre script essaie d'envoyer un en-tête HTTP au client mais qu'il y a déjà eu une sortie auparavant, ce qui a eu pour conséquence que les en-têtes ont déjà été envoyés au client.

Il s'agit d'un E_WARNING et cela n'arrêtera pas le script.

Un exemple typique serait un fichier modèle comme celui-ci :

<html>
    <?php session_start(); ?>
    <head><title>My Page</title>
</html>
...

Le session_start() essaiera d'envoyer au client des en-têtes contenant le cookie de session. Mais PHP a déjà envoyé des en-têtes lorsqu'il a écrit la fonction <html> vers le flux de sortie. Vous devez déplacer l'élément session_start() au sommet.

Vous pouvez résoudre ce problème en parcourant les lignes avant le code qui déclenche l'avertissement et vérifiez où il s'affiche. Déplacez tout code d'envoi d'en-tête avant ce code.

Un résultat souvent négligé est l'ajout de nouvelles lignes après la fermeture de PHP. ?> . Il est considéré comme une pratique courante d'omettre ?> lorsqu'il s'agit du dernier élément du fichier. De même, une autre cause fréquente de cet avertissement est le fait que le fichier d'ouverture <?php est précédé d'un espace vide, d'une ligne ou d'un caractère invisible, ce qui fait que le serveur web enverra les en-têtes et l'espace vide/la nouvelle ligne et donc, lorsque PHP commencera l'analyse, ne pourra pas soumettre d'en-tête.

Si votre fichier comporte plus d'un <?php ... ?> Il ne doit pas y avoir d'espace entre les deux blocs de code. (Remarque : vous pouvez avoir plusieurs blocs si votre code a été construit automatiquement).

Assurez-vous également qu'il n'y a pas de marque d'ordre d'octet dans votre code, par exemple lorsque l'encodage du script est UTF-8 avec BOM.

Questions connexes :

2 votes

Si vous utilisez WordPress, vérifiez les fichiers du thème. Lorsque j'ai mis à jour un site vers une nouvelle version de WordPress, je n'ai pas pu mettre à jour le thème parce qu'il n'avait pas été mis à jour depuis plusieurs années. Ce problème est apparu. Il s'est avéré que le fichier functions.php contenait plus d'un bloc < ? ?> avec des espaces entre les deux.

2 votes

@RoyLeban "Si votre fichier contient plus d'un bloc..." Je ne suis pas sûr de ce que cela signifie. Qu'est-ce qu'un "bloc" ? Un bloc serait-il composé de <?php ?> et donc "plus d'un bloc" serait <?php ?> <?php ?> ?

2 votes

Si possible, activez la fonction "output buffering" dans le fichier de configuration PHP.ini. Elle permet de résoudre ce problème. Le fichier html est sauvegardé dans le tampon de sortie et envoyé au client uniquement après l'arrêt du script, de sorte que si deux en-têtes sont émis à des endroits différents, l'ancien en-tête sera remplacé par le nouvel en-tête.

200voto

hakre Points 102271

Erreur fatale : Appel à une fonction membre ... sur un non-objet

Cela se produit avec un code similaire à xyz->method() donde xyz n'est pas un objet et donc que method ne peut être appelé.

Il s'agit d'une erreur fatale qui arrêtera le script (avis de compatibilité ascendante) : Elle deviendra une erreur rattrapable à partir de PHP 7).

Le plus souvent, il s'agit d'un signe que le code comporte des vérifications manquantes pour les conditions d'erreur. Validez qu'un objet est bien un objet avant d'appeler ses méthodes.

A typique L'exemple est le suivant

// ... some code using PDO
$statement = $pdo->prepare('invalid query', ...);
$statement->execute(...);

Dans l'exemple ci-dessus, la requête ne peut pas être préparée et prepare() attribuera false a $statement . En essayant d'appeler le execute() aboutira à une erreur fatale, car la méthode false est un "non-objet" parce que la valeur est un booléen.

Chiffrer pourquoi votre fonction a renvoyé un booléen au lieu d'un objet. Par exemple, vérifiez l'élément $pdo pour la dernière erreur survenue. Les détails concernant le débogage dépendent de la manière dont les erreurs sont gérées pour la fonction, l'objet ou la classe en question.

Si même le ->prepare échoue, alors votre $pdo objet de la poignée de la base de données n'a pas été passé dans le champ d'application actuel . Trouvez l'endroit où il a été défini. Ensuite, passez-le en tant que paramètre, stockez-le en tant que propriété ou partagez-le via le champ d'application global.

Un autre problème peut résulter de la création conditionnelle d'un objet et de la tentative d'appeler une méthode en dehors de ce bloc conditionnel. Par exemple

if ($someCondition) {
    $myObj = new MyObj();
}
// ...
$myObj->someMethod();

En essayant d'exécuter la méthode en dehors du bloc conditionnel, il se peut que votre objet ne soit pas défini.

Questions connexes :

125voto

nalply Points 4675

On ne voit rien. La page est vide et blanche.

Également connu sous le nom de Page blanche de la mort o Écran blanc de la mort . Cela se produit lorsque le rapport d'erreur est désactivé et qu'une erreur fatale (souvent une erreur de syntaxe) s'est produite.

Si l'enregistrement des erreurs est activé, vous trouverez le message d'erreur concret dans votre journal des erreurs. Celui-ci se trouve généralement dans un fichier appelé "php_errors.log", soit dans un emplacement central (par ex. /var/log/apache2 sur de nombreux environnements Linux) ou dans le répertoire du script lui-même (parfois utilisé dans un environnement d'hébergement partagé).

Il est parfois plus simple d'activer temporairement l'affichage des erreurs. La page blanche affichera alors le message d'erreur. Faites attention, car ces erreurs sont visibles par toutes les personnes qui visitent le site web.

Ceci peut être facilement réalisé en ajoutant en haut du script le code PHP suivant :

ini_set('display_errors', 1); error_reporting(~0);

Le code activera l'affichage des erreurs et mettra le rapport au niveau le plus élevé.

Depuis l'entrée en vigueur de la ini_set() est exécuté au moment de l'exécution, il n'a aucun effet sur les erreurs d'analyse et de syntaxe. Ces erreurs apparaîtront dans le journal. Si vous souhaitez les afficher également dans la sortie (par exemple, dans un navigateur), vous devez définir la propriété display_startup_errors à la directive true . Cette opération peut être effectuée soit dans le php.ini ou dans un .htaccess ou par toute autre méthode affectant la configuration avant durée d'exécution .

Vous pouvez utiliser les mêmes méthodes pour définir le log_errors y error_log pour choisir votre propre emplacement de fichier journal.

En regardant dans le journal ou en utilisant l'affichage, vous obtiendrez un bien meilleur message d'erreur et la ligne de code où votre script s'arrête.

Questions connexes :

Erreurs connexes :

3 votes

error_reporting(~0); pourquoi pas -1 ? C'est ce que ~0 évalue à, et est beaucoup moins énigmatique.

3 votes

Je pense que les deux sont aussi énigmatiques l'un que l'autre. ~0 est plus explicite IMO : annuler l'ensemble de bits vides, c'est-à-dire activer tous drapeaux. -1 ne signifie pas "non trouvé" comme dans strpos() en C, mais un ensemble de bits avec tous les drapeaux activés, car -1 est binaire 1111'1111'1111'1111 (pour 32 bits).

2 votes

Oups, 1111'1111'1111'1111 est en réalité de 16 bits, mais j'espère que vous comprenez ce que je veux dire.

109voto

Gordon Points 156415

"Notice : Index non défini", ou "Avertissement : Clé de tableau non définie"

Se produit lorsque vous essayez d'accéder à un tableau par une clé qui n'existe pas dans le tableau.

Un exemple typique d'un Undefined Index serait ( démo )

$data = array('foo' => '42', 'bar');
echo $data['spinach'];
echo $data[1];

Les deux spinach y 1 n'existent pas dans le tableau, ce qui provoque un E_NOTICE à déclencher. En PHP 8.0, il s'agit plutôt d'un E_WARNING.

La solution consiste à s'assurer que l'index ou le décalage existe avant d'accéder à cet index. Cela peut signifier que vous devez corriger un bogue dans votre programme pour vous assurer que ces index existent lorsque vous vous y attendez. Vous pouvez également tester l'existence des index en utilisant la commande array_key_exists o isset :

$data = array('foo' => '42', 'bar');
if (array_key_exists('spinach', $data)) {
    echo $data['spinach'];
}
else {
    echo 'No key spinach in the array';
}

Si vous avez un code comme :

<?php echo $_POST['message']; ?>
<form method="post" action="">
    <input type="text" name="message">
    ...

puis $_POST['message'] ne sera pas défini lorsque cette page sera chargée pour la première fois et vous obtiendrez l'erreur ci-dessus. Ce n'est que lorsque le formulaire est soumis et que ce code est exécuté une seconde fois que l'index du tableau existe. Vous vérifiez généralement cela à l'aide de la commande

if ($_POST)  ..  // if the $_POST array is not empty
// or
if ($_SERVER['REQUEST_METHOD'] == 'POST') ..  // page was requested with POST

Questions connexes :

0 votes

J'ai tendance à utiliser if(!empty($_POST['message'])){ //do stuff }

90voto

xdazz Points 85907

Warning : mysql_fetch_array() expects parameter 1 to be resource, boolean given

D'abord et avant tout :

*S'il vous plaît, n'utilisez pas `mysql_` fonctions dans le nouveau code** . Ils ne sont plus entretenus et sont officiellement obsolètes . Voir le boîte rouge ? En savoir plus déclarations préparées à la place, et utiliser AOP o MySQLi - cet article vous aidera à faire votre choix. Si vous choisissez PDO, Voici un bon tutoriel .


Cela se produit lorsque vous essayez d'extraire des données du résultat d'une commande mysql_query mais la requête a échoué.

Il s'agit d'un avertissement qui n'arrêtera pas le script, mais qui rendra votre programme erroné.

Vous devez vérifier le résultat renvoyé par mysql_query por

$res = mysql_query($sql);
if (!$res) {
   die(mysql_error());
}
// after checking, do the fetch

Questions connexes :

Erreurs connexes :

Autres mysql* qui attendent également une ressource de résultat MySQL en tant que paramètre produiront la même erreur pour la même raison.

5 votes

Juste une remarque. Si mysql_query n'est pas assez grave, en ajoutant or die en plus, c'est ajouter l'insulte à l'injure.

0 votes

Le problème que je rencontre est le suivant $res = mysql_query($query) renvoie 1 si la requête a abouti, elle est donc considérée comme vraie. Par conséquent, lorsque l'on transmet le résultat de mysql_query à mysql_fetch_array() l'avis indique.

0 votes

@mboy Pour les instructions SELECT, SHOW, DESCRIBE, EXPLAIN et autres qui renvoient un jeu de résultats, mysql_query() renvoie une ressource en cas de succès, ou FALSE en cas d'erreur. Pour les autres types d'instructions SQL, INSERT, UPDATE, DELETE, DROP, etc, mysql_query() renvoie TRUE en cas de succès ou FALSE en cas d'erreur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X