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


Qu'est-ce que c'est?

Ceci est un certain nombre de réponses sur les avertissements, les erreurs et les avis que vous pourriez rencontrer lors de la programmation PHP et n'ont aucune idée de comment réparer. Il s'agit également d'un wiki communautaire, de sorte que tout le monde est invité à participer à l'ajout et au maintien de cette liste.

Pourquoi est-ce?

Des questions comme "En-têtes déjà envoyés" ou "Appel d'un membre d'un non-objet" pop-up fréquemment sur Stack Overflow. La cause première de ces questions est toujours la même. Ainsi, les réponses à ces questions les répètent généralement, puis montrent à l'OP quelle ligne changer dans son cas particulier. Ces réponses n'ajoutent aucune valeur au site car elles s'appliquent uniquement au code particulier du PO. Les autres utilisateurs ayant la même erreur ne peuvent pas facilement lire la solution car ils sont trop localisés. C'est triste, car une fois que vous avez compris la cause première, la correction de l'erreur est triviale. Par conséquent, cette liste tente d'expliquer la solution d'une manière générale à appliquer.

Que devrais-je faire ici?

Si votre question a été marquée comme doublon, veuillez trouver votre message d'erreur ci-dessous et appliquer le correctif à votre code. Les réponses contiennent généralement d'autres liens pour enquêter au cas où la réponse générale ne le permettrait pas.

Si vous souhaitez contribuer, veuillez ajouter votre message d'erreur "favori", avertissement ou avis, un par réponse, une courte description de ce que cela signifie (même si ce n'est que la mise en évidence des termes sur leur page de manuel), une solution possible une liste des questions et réponses existantes qui ont de la valeur. Aussi, n'hésitez pas à améliorer les réponses existantes.

La liste

Regarde aussi


907


origine


Réponses:


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

Se produit lorsque votre script tente d'envoyer un en-tête HTTP au client mais qu'il y en avait déjà eu auparavant, ce qui a entraîné l'envoi d'en-têtes au client.

C'est un E_WARNING et ça n'arrêtera pas le script.

Un exemple typique serait un fichier de modèle comme ceci:

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

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

Vous pouvez résoudre cela en passant par les lignes avant le code déclenchant l'avertissement et vérifie où il sort. Déplacez n'importe quel code d'envoi d'en-tête avant ce code.

Une sortie souvent négligée est de nouvelles lignes après la fermeture de PHP ?>. Il est considéré comme une pratique standard d'omettre ?> quand c'est la dernière chose dans le fichier. De même, une autre cause commune de cet avertissement est lorsque l'ouverture <?php a un espace vide, une ligne ou un caractère invisible devant lui, ce qui oblige le serveur web à envoyer les en-têtes et les espaces / nouvelle ligne ainsi quand PHP commence l'analyse ne sera pas capable de soumettre n'importe quel en-tête.

Si votre fichier a plus d'un <?php ... ?> bloc de code, vous ne devriez pas avoir d'espaces entre eux. (Remarque: vous pourriez avoir plusieurs blocs si vous aviez du code construit automatiquement)

Assurez-vous également que vous n'avez pas de marque de commande Byte dans votre code, par exemple lorsque le codage du script est UTF-8 avec BOM.

Questions connexes:


225



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

Happens avec un code similaire à xyz->method() où xyz n'est pas un objet et donc method ne peut pas être appelé.

C'est une erreur fatale qui va stopper le script (forward notice de compatibilité: il deviendra une erreur rattrapable à partir de PHP 7).

Le plus souvent, c'est un signe que le code a des vérifications manquantes pour les conditions d'erreur. Validez qu'un objet est en fait un objet avant d'appeler ses méthodes.

UNE typique exemple serait

// ... 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() assignera false à $statement. Essayer d'appeler le execute() méthode entraînera alors l'erreur fatale, car false est un "non-objet" car la valeur est un booléen.

Comprendre Pourquoi Votre fonction a renvoyé un booléen au lieu d'un objet. Par exemple, vérifiez le $pdo objet pour la dernière erreur qui s'est produite. Les détails sur la façon de déboguer cela dépendront de la façon dont les erreurs sont traitées pour la fonction / l'objet / la classe en question.

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

Un autre problème peut être la création conditionnelle d'un objet, puis essayer 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, votre objet peut ne pas être défini.

Questions connexes:


156



Rien n'est vu. La page est vide et blanche.

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

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

Parfois, il peut être 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 tous ceux qui visitent le site.

Cela peut être facilement fait 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 définira le rapport au plus haut niveau.

Depuis le ini_set() est exécuté à l'exécution, il n'a aucun effet sur les erreurs d'analyse syntaxique. Ces erreurs apparaîtront dans le journal. Si vous souhaitez également les afficher dans la sortie (par exemple dans un navigateur), vous devez définir display_startup_errors directive à true. Faites-le soit dans le php.ini ou dans un .htaccess ou par toute autre méthode qui affecte la configuration avant runtime.

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

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

Questions connexes:

Erreurs liées:


100



Avis: Index indéfini

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

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

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

Tous les deux spinach et 1 n'existent pas dans le tableau, provoquant un E_NOTICE être déclenché.

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 quand vous le souhaitez. Ou cela peut signifier que vous devez tester si les index existent en utilisant array_key_exists ou isset:

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

Si vous avez du 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 est 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 deuxième fois que l'index du tableau existe. Vous vérifiez généralement cela avec:

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

Questions connexes:


89



Attention: mysql_fetch_array () attend que le paramètre 1 soit resource, booléen donné

Tout d'abord:

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 sur déclarations préparées à la place, et utiliser AOP ou MySQLi - Cet article vous aidera à décider lequel. Si vous choisissez PDO, Voici un bon tutoriel.


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

Ceci est un avertissement et n'arrêtera pas le script, mais rendra votre programme incorrect.

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

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

Questions connexes:

Erreurs liées:

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


75



Erreur irrécupérable: Utiliser $ this quand il n'est pas dans un contexte d'objet

$this est une variable spéciale en PHP qui ne peut pas être affecté. S'il est accédé dans un contexte où il n'existe pas, cette erreur fatale est donnée.

Cette erreur peut se produire:

  1. Si une méthode non statique est appelée statiquement. Exemple:

    class Foo {
       protected $var;
       public function __construct($var) {
           $this->var = $var;
       }
    
       public static function bar () {
           // ^^^^^^
           echo $this->var;
           //   ^^^^^
       }
    }
    
    Foo::bar();
    

    Comment réparer: revoir votre code, $this ne peut être utilisé que dans un contexte d'objet et ne doit jamais être utilisé dans une méthode statique. En outre, une méthode statique ne doit pas accéder à la propriété non statique. Utilisation self::$static_property pour accéder à la propriété statique.

  2. Si le code d'une méthode de classe a été copié dans une fonction normale ou simplement dans la portée globale et garder le $thisvariable spéciale
    Comment réparer: Passez en revue le code et remplacez $this avec une variable de substitution différente.

Questions connexes:

  1. Appelez la méthode non statique comme statique: PHP Erreur irrécupérable: Utiliser $ this quand il n'est pas dans un contexte d'objet
  2. Copier sur le code: Erreur irrécupérable: Utiliser $ this quand il n'est pas dans un contexte d'objet
  3. Tout "Utiliser $ this quand il n'est pas dans un contexte d'objet" Questions sur Stackoverflow

69



Erreur fatale: appel à la fonction indéfinie XXX

Se produit lorsque vous essayez d'appeler une fonction qui n'est pas encore définie. Les causes communes incluent les extensions et les inclusions manquantes, la déclaration de fonction conditionnelle, la fonction dans la déclaration de fonction ou les fautes de frappe simples.

Exemple 1 - Déclaration de fonction conditionnelle

$someCondition = false;
if ($someCondition === true) {
    function fn() {
        return 1;
    }
}
echo fn(); // triggers error

Dans ce cas, fn() ne sera jamais déclaré parce que $someCondition ce n'est pas vrai.

Exemple 2 - Fonction dans la déclaration de fonction

function createFn() 
{
    function fn() {
        return 1;
    }
}
echo fn(); // triggers error

Dans ce cas, fn ne sera déclaré qu'une seule fois createFn() est appelé. Notez que les appels suivants à createFn() déclenchera une erreur sur la redéclaration d'une fonction existante.

Vous pouvez également voir ceci pour une fonction intégrée de PHP. Essayez de rechercher la fonction dans le manuel officiel, et vérifiez à quelle "extension" (module PHP) il appartient, et quelles versions de PHP le supportent.

En cas d'extension manquante, installez cette extension et activez-la dans php.ini. Reportez-vous aux instructions d'installation dans le manuel PHP pour connaître l'extension dans laquelle votre fonction apparaît. Vous pouvez également activer ou installer l'extension à l'aide de votre gestionnaire de paquets (par ex. apt dans Debian ou Ubuntu, yum dans Red Hat ou CentOS), ou un panneau de contrôle dans un environnement d'hébergement partagé.

Si la fonction a été introduite dans une nouvelle version de PHP à partir de ce que vous utilisez, vous pouvez trouver des liens vers des implémentations alternatives dans le manuel ou dans sa section de commentaire. Si elle a été supprimée de PHP, cherchez des informations sur pourquoi, car cela peut ne plus être nécessaire.

En cas d'inclusion manquante, assurez-vous d'inclure le fichier déclarant la fonction avant d'appeler la fonction.

En cas de fautes de frappe, corrigez la faute de frappe.

Questions connexes:


66



Erreur d'analyse: erreur de syntaxe, inattendue T_XXX

Ça arrive quand vous avez T_XXX jeton dans un endroit inattendu, des parenthèses déséquilibrées (superflues), l'utilisation de la balise courte sans l'activer dans php.ini, et beaucoup plus.

Questions connexes:

Pour plus d'aide, voir:


65



Erreur fatale: Impossible d'utiliser la valeur de retour de la fonction dans le contexte d'écriture

Cela arrive généralement lorsque vous utilisez une fonction directement avec empty.

Exemple:

if (empty(is_null(null))) {
  echo 'empty';
}

Ceci est dû au fait empty est une construction de langage et non une fonction, elle ne peut pas être appelée avec une expression comme argument dans les versions de PHP antérieures à 5.5. Avant PHP 5.5, l'argument de empty()Doit être un variable, mais une expression arbitraire (telle que la valeur de retour d'une fonction) est autorisée dans PHP 5.5+.

empty, malgré son nom, ne vérifie pas si une variable est "vide". Au lieu de cela, il vérifie si une variable n'existe pas, ou == false. Expressions (comme is_null(null) dans l'exemple) sera toujours réputé exister, alors voici empty est seulement en train de vérifier si elle est égale à false. Vous pourriez remplacer empty() ci-joint !, par exemple. if (!is_null(null)), ou comparez-les explicitement à false, par ex. if (is_null(null) == false).

Questions connexes:


60



MySQL: Vous avez une erreur dans votre syntaxe SQL; consultez le manuel qui correspond à votre version du serveur MySQL pour la bonne syntaxe à utiliser près de ... à la ligne ...

Cette erreur est souvent causée parce que vous avez oublié d'échapper correctement les données passées à une requête MySQL.

Un exemple de quoi ne pas faire (la "mauvaise idée"):

$query = "UPDATE `posts` SET my_text='{$_POST['text']}' WHERE id={$_GET['id']}";
mysqli_query($db, $query);

Ce code pourrait être inclus dans une page avec un formulaire à soumettre, avec une URL telle que http://example.com/edit.php?id=10 (pour éditer le message n ° 10)

Que se passera-t-il si le texte soumis contient des guillemets simples? $query va se retrouver avec:

$query = "UPDATE `posts` SET my_text='I'm a PHP newbie' WHERE id=10';

Et quand cette requête est envoyée à MySQL, elle se plaindra que la syntaxe est fausse, car il y a une citation simple supplémentaire au milieu.

Pour éviter de telles erreurs, vous DOIT toujours échapper les données avant utilisation dans une requête.

Échapper des données avant de les utiliser dans une requête SQL est également très important car si vous ne le faites pas, votre script sera ouvert aux injections SQL. Une injection SQL peut entraîner la modification, la perte ou la modification d'un enregistrement, d'une table ou d'une base de données entière. C'est un problème de sécurité très sérieux!

Documentation:


57



Erreur fatale: La taille de la mémoire autorisée de XXX octets est épuisée (tentative d'allocation de XXX octets)

Il n'y a pas assez de mémoire pour exécuter votre script. PHP a atteint la limite de mémoire et arrête de l'exécuter. Cette erreur est fatale, le script s'arrête. La valeur du limite de mémoire peut être configuré soit dans le php.ini fichier ou en utilisant ini_set('memory_limit', '128 M'); dans le script (qui écrasera la valeur définie dans php.ini). Le but de la limite de mémoire est d'empêcher un seul script PHP d'engloutir toute la mémoire disponible et de faire tomber tout le serveur web.

La première chose à faire est de minimiser la quantité de mémoire dont votre script a besoin. Par exemple, si vous lisez un fichier volumineux dans une variable ou que vous extrayez plusieurs enregistrements d'une base de données et que vous les stockez tous dans un tableau, cela peut nécessiter beaucoup de mémoire. Changez votre code pour lire à la place le fichier ligne par ligne ou récupérer les enregistrements de base de données un à la fois sans les stocker tous en mémoire. Cela nécessite un peu de conscience conceptuelle de ce qui se passe dans les coulisses et quand les données sont stockées dans la mémoire par rapport à d'autres.

Si cette erreur se produisait lorsque votre script n'effectuait pas de travail nécessitant beaucoup de mémoire, vous devez vérifier votre code pour voir s'il y a une fuite de mémoire. le memory_get_usage la fonction est votre ami.

Questions connexes:


49