web-dev-qa-db-fra.com

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

Qu'est-ce que c'est?

Voici un certain nombre de réponses sur les avertissements, les erreurs et les remarques que vous pourriez rencontrer lors de la programmation PHP - et vous ne savez pas comment les corriger. Il s’agit également d’un wiki de communauté. Tous sont invités à participer à l’ajout et au maintien de cette liste. 

Pourquoi est-ce?

Des questions telles que "En-têtes déjà envoyés" ou "Appel d'un membre d'un non-objet" pop-up fréquemment lors d'un dépassement de pile. La cause fondamentale de ces questions est toujours la même. Ainsi, les réponses à ces questions les répètent généralement, puis indiquent au PO quelle ligne modifier dans son cas particulier. Ces réponses n’ajoutent aucune valeur au site car elles ne concernent que le 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 du problème, la résolution de l'erreur est triviale. Par conséquent, cette liste tente d’expliquer la solution de manière générale.

Que devrais-je faire ici?

Si votre question a été marquée comme un doublon, retrouvez votre message d'erreur ci-dessous et appliquez le correctif à votre code. Les réponses contiennent généralement des liens supplémentaires à explorer au cas où cela ne ressortirait pas uniquement de la réponse générale.

Si vous souhaitez contribuer, veuillez ajouter votre message d’erreur, votre avertissement ou votre avis "favori", un par réponse, une brève description de sa signification (même s’il ne met que des termes en surbrillance dans leur page de manuel), une solution possible ou une approche de débogage et une liste des questions et réponses existantes. Aussi, n'hésitez pas à améliorer les réponses existantes.

La liste

Regarde aussi 

993
hakre

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

Cela se produit lorsque votre script essaie d'envoyer un en-tête HTTP au client mais qu'il y avait déjà une sortie auparavant, ce qui entraînait l'envoi des en-têtes au client.

Ceci est un E_WARNING et cela n'arrêtera pas le script.

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

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

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

Vous pouvez résoudre ce problème en passant par les lignes avant le code déclenchant l’Avertissement et en vérifiant où il s’affiche. Déplacez tout code d'envoi d'en-tête avant ce code. 

Une sortie souvent négligée est celle des nouvelles lignes après le ?> de fermeture de PHP. Il est considéré comme une pratique standard d'omettre ?> lorsqu'il s'agit de la dernière chose dans le fichier. De même, une autre cause fréquente de cet avertissement est lorsque le <?php d'ouverture a un espace, une ligne ou un caractère invisible devant celui-ci, ce qui amène le serveur Web à envoyer les en-têtes et les espaces/nouvelles lignes ainsi lorsque PHP commence à analyser gagné t être capable de soumettre n'importe quel en-tête.

Si votre fichier contient plus d'un bloc de code <?php ... ?>, vous ne devez pas insérer d'espaces entre eux. (Remarque: vous pourriez avoir plusieurs blocs si votre code était construit automatiquement)

Assurez-vous également que votre code ne contient aucune marque d'ordre d'octet, par exemple lorsque le codage du script est UTF-8 avec nomenclature.

Questions connexes:

247
Gordon

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

Cela se produit avec un code similaire à xyz->method()xyz n'est pas un objet et par conséquent, method ne peut pas être appelé.

Il s’agit d’une erreur fatale qui arrêtera le script (remarque de compatibilité aval: elle deviendra une erreur capturable commençant par PHP 7).

Le plus souvent, cela indique que le code ne contient pas de vérifications des conditions d'erreur. Validez qu'un objet est en réalité un objet avant d'appeler ses méthodes.

Un 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. Si vous essayez d'appeler la méthode execute(), vous obtiendrez l'erreur fatale car false est un "non-objet" car sa valeur est un booléen.

Calculez pourquoi votre fonction a renvoyé un booléen au lieu d'un objet. Par exemple, recherchez la dernière erreur survenue dans l'objet $pdo. Les détails sur la manière de déboguer cela dépendront de la façon dont les erreurs sont gérées pour la fonction/l'objet/la classe en question.

Si même le ->prepare échoue, votre objet de descripteur de base de données $pdon'est pas passé dans la portée actuelle . Trouvez où il a été défini. Ensuite, transmettez-le en tant que 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 la tentative d'appeler une méthode en dehors de ce bloc conditionnel. Par exemple

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

En tentant d'exécuter la méthode en dehors du bloc conditionnel, votre objet peut ne pas être défini.

Questions connexes:

174
hakre

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

Aussi connu sous le nom de page blanche de la mort ou é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 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 exemple, /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 toutes les personnes visitant 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 fixera le rapport au plus haut niveau.

Etant donné que ini_set() est exécuté à l'exécution, cela 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 la directive display_startup_errors sur true. Faites cela dans le php.ini ou dans un .htaccess ou par toute autre méthode ayant une incidence sur la configuration before runtime .

Vous pouvez utiliser les mêmes méthodes pour définir les directives log_errors et error_log afin de choisir votre propre emplacement dans le 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ù le script doit s'arrêter.

Questions connexes:

Erreurs connexes:

108
nalply

Avis: index non défini

Cela se produit lorsque vous essayez d'accéder à un tableau à l'aide d'une clé qui n'existe pas dans le tableau. 

Un exemple typique d'avis Undefined Index serait ( demo )

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

spinach et 1 n'existent pas dans le tableau, ce qui provoque le déclenchement d'un E_NOTICE .

La solution consiste à vérifier 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. Cela peut également signifier que vous devez vérifier l'existence des index à l'aide de 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 the array';
}

Si vous avez un code comme:

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

alors $_POST['message'] ne sera pas défini lors du premier chargement de cette page et vous obtiendrez l'erreur ci-dessus. L'index de tableau existe uniquement lorsque le formulaire est soumis et que ce code est exécuté une seconde fois. 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:

94
Gordon

Avertissement: mysql_fetch_array () s'attend à ce que le paramètre 1 soit une ressource, booléen

Tout d'abord:

Veuillez ne pas utiliser les fonctions mysql_* dans le nouveau code . Ils ne sont plus maintenus et sont officiellement obsolètes . Voir la boîte rouge ? En savoir plus sur instructions préparées à la place, et utilisez PDO ou MySQLi - cet article vous aidera à choisir. 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 que la requête a échoué.

Ceci est un avertissement qui n'arrêtera pas le script, mais faussera votre programme.

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 connexes:

D'autres fonctions 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.

81
xdazz

Erreur fatale: utilisation de $ this lorsque le contexte de l'objet n'est pas

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

Cette erreur peut survenir:

  1. Si une méthode non statique est appelée de manière statique. Exemple:

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

    Comment résoudre ce problème examinez à nouveau 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. Utilisez 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 en conservant la variable spéciale $this.
    Comment résoudre ce problème Consultez le code et remplacez $this par une autre variable de substitution.

Questions connexes:

  1. Appelez une méthode non statique en tant que statique: PHP Erreur fatale: utilisation de $ this sans contexte d'objet
  2. Copier sur le code: Erreur irrécupérable: Utilisation de $ this sans contexte d'objet
  3. All "Utilisation de $ this sans contexte d'objet" Questions sur Stackoverflow
72
xdazz

Erreur fatale: appel de la fonction non définie XXX

Cela se produit lorsque vous essayez d'appeler une fonction qui n'est pas encore définie. Les causes courantes incluent les extensions manquantes et inclut, la déclaration de fonction conditionnelle, la fonction dans une déclaration de fonction ou des 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é car $someCondition 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é que lorsque createFn() sera appelé. Notez que les appels ultérieurs à createFn() déclencheront une erreur concernant la redéclaration d'une fonction existante.

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

Si une extension est 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 avec laquelle votre fonction apparaît. Vous pourrez également activer ou installer l'extension à l'aide de votre gestionnaire de paquets (par exemple, 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 version plus récente 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. S'il a été supprimé de PHP, cherchez des informations sur les raisons, car cela pourrait ne plus être nécessaire.

En cas d'inclusions manquantes, 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:

70
Gordon

Erreur d'analyse: erreur de syntaxe, T_XXX inattendu

Cela se produit lorsque vous avez le jeton T_XXX dans un endroit inattendu, des parenthèses déséquilibrées (superflues), l'utilisation d'une balise courte sans l'activer dans le fichier php.ini, etc.

Questions connexes:

Pour une aide supplémentaire, voir:

68
LeleDumbo

Erreur fatale: impossible d'utiliser la valeur renvoyée par la fonction dans un contexte d'écriture

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

Exemple:

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

En effet, empty est une construction de langage et non une fonction. Il ne peut pas être appelé avec une expression en tant qu'argument dans les versions PHP antérieures à la version 5.5. Avant PHP 5.5, l'argument de empty() doit être un variable, mais une expression arbitraire (telle qu'une valeur de retour d'une fonction) est autorisée dans PHP 5.5+.

empty, malgré son nom, ne vérifie pas réellement si une variable est "vide". Au lieu de cela, il vérifie si une variable n'existe pas, ou == false. Les expressions (comme is_null(null) dans l'exemple) seront toujours réputées exister, donc ici empty vérifie seulement si elle est égale à false. Vous pouvez remplacer empty() ici par !, par exemple. if (!is_null(null)), ou explicitement comparé à false, par exemple. if (is_null(null) == false).

Questions connexes:

65
xdazz

MySQL: vous avez une erreur dans votre syntaxe SQL; Consultez le manuel correspondant à la version de votre serveur MySQL pour connaître la syntaxe à utiliser près de ... à la ligne ...

Cette erreur est souvent due au fait que vous avez oublié d'échapper correctement aux données transmises à une requête MySQL.

Un exemple de ce que not n'a 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 post n ° 10)

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

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

Et lorsque cette requête est envoyée à MySQL, la syntaxe est incorrecte, car il y a un guillemet supplémentaire au milieu.

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

Échapper aux données avant leur utilisation dans une requête SQL est également très important, car sinon, votre script sera ouvert aux injections SQL. Une injection SQL peut provoquer une altération, une perte ou une 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 grave!

Documentation:

59
Jocelyn

Erreur fatale: la taille de mémoire autorisée de XXX octets est épuisée (vous avez essayé d'allouer 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 de memory limit peut être configurée dans le fichier php.ini ou en utilisant ini_set('memory_limit', '128 M'); dans le script (ce qui écrasera la valeur définie dans php.ini). Le but de la limite de mémoire est d'empêcher qu'un seul script PHP engloutisse toute la mémoire disponible et fasse baisser l'intégralité du 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 récupérez de nombreux enregistrements dans une base de données et que vous les stockez tous dans un tableau, cela peut utiliser beaucoup de mémoire. Modifiez votre code pour lire le fichier ligne par ligne ou récupérez les enregistrements de base de données un par un sans les stocker tous en mémoire. Cela nécessite une certaine connaissance conceptuelle de ce qui se passe dans les coulisses et du moment où les données sont stockées en mémoire par rapport à un autre.

Si cette erreur se produit lorsque votre script ne fait pas un travail intensif en mémoire, vous devez vérifier votre code pour voir s'il existe une fuite de mémoire. La fonction memory_get_usage est votre ami.

Questions connexes:

50
xdazz

Erreur d'analyse: erreur de syntaxe, T_ENCAPSED_AND_WHITESPACE inattendu

Cette erreur survient le plus souvent lors de la tentative de référence à une valeur de tableau avec une clé entre guillemets pour l'interpolation dans une chaîne entre guillemets lorsque la construction de variable complexe entière n'est pas comprise dans {}.

Le cas d'erreur:

Cela se traduira par Unexpected T_ENCAPSED_AND_WHITESPACE:

echo "This is a double-quoted string with a quoted array key in $array['key']";
//---------------------------------------------------------------------^^^^^

Corrections possibles:

Dans une chaîne entre guillemets doubles, PHP autorisera l'utilisation de chaînes de clé de tableau sans guillemets, et n'émettra pas de E_NOTICE. Donc, ce qui précède pourrait être écrit comme:

echo "This is a double-quoted string with an un-quoted array key in $array[key]";
//------------------------------------------------------------------------^^^^^

La variable et les clés de tableau complexes entières peuvent être placées dans {}, auquel cas elles devraient être citées pour éviter un E_NOTICE. La documentation PHP recommande cette syntaxe pour les variables complexes.

echo "This is a double-quoted string with a quoted array key in {$array['key']}";
//--------------------------------------------------------------^^^^^^^^^^^^^^^
// Or a complex array property of an object:
echo "This is a a double-quoted string with a complex {$object->property->array['key']}";

Bien sûr, l’alternative à any de ce qui précède est de concaténer la variable tableau au lieu de l’interpoler:

echo "This is a double-quoted string with an array variable". $array['key'] . " concatenated inside.";
//----------------------------------------------------------^^^^^^^^^^^^^^^^^^^^^

Pour référence, voir la section sur Analyse des variables dans la page de manuel PHP Strings

48
Michael Berkowski

Avertissement: [fonction]: échec de l'ouverture du flux: [raison]

Cela se produit lorsque vous appelez un fichier généralement par include, require ou fopen et PHP ne parvenez pas à trouver le fichier ou n’avez pas assez de permission pour le charger.

Cela peut se produire pour diverses raisons:

  • le chemin du fichier est faux
  • le chemin du fichier est relatif
  • inclure le chemin est faux
  • les autorisations sont trop restrictives
  • SELinux est en vigueur
  • et beaucoup plus ...

Une erreur courante est de ne pas utiliser un chemin absolu. Cela peut être facilement résolu en utilisant un chemin complet ou des constantes magiques comme __DIR__ ou dirname(__FILE__):

include __DIR__ . '/inc/globals.inc.php';

ou:

require dirname(__FILE__) . '/inc/globals.inc.php';

S'assurer que le bon chemin est utilisé est l'une des étapes de la résolution de ces problèmes. Cela peut également être lié à des fichiers inexistants, aux droits du système de fichiers empêchant l'accès ou à des restrictions d'ouverture basées sur PHP.

La meilleure façon de résoudre ce problème rapidement est de suivre la liste de contrôle de dépannage ci-dessous.

Questions connexes:

Erreurs connexes:

40
Mahdi

Erreur d'analyse: erreur de syntaxe, T_PAAMAYIM_NEKUDOTAYIM inattendu

L'opérateur de résolution de la portée s'appelle également "Paamayim Nekudotayim" de l'hébreu יים ודתיים. ce qui signifie "double colon" ou "double point deux fois".

Cette erreur se produit généralement si vous insérez par inadvertance :: dans votre code.

Questions connexes:

Documentation:

40
Rich Bradshaw

Remarque: Utilisation de la constante non définie XXX - supposée 'XXX'

ou, dans PHP 7.2 ou version ultérieure:

Attention: Utilisation de la constante non définie XXX - supposée 'XXX' (cela provoquera une erreur dans une future version de PHP)

Cette notification se produit lorsqu'un jeton est utilisé dans le code et semble être une constante, mais qu'une constante portant ce nom n'est pas définie.

L’une des causes les plus courantes de cet avis est l’incapacité de citer une chaîne utilisée comme clé de tableau associatif.

Par exemple:

// Wrong
echo $array[key];

// Right
echo $array['key'];

Une autre cause fréquente est un signe $ (dollar) manquant devant un nom de variable:

// Wrong
echo varName;

// Right
echo $varName;

Ou peut-être avez-vous mal orthographié une autre constante ou mot clé:

// Wrong
$foo = fasle;

// Right
$foo = false;

Cela peut également indiquer qu'une extension ou une bibliothèque PHP nécessaire est manquante lorsque vous essayez d'accéder à une constante définie par cette bibliothèque.

Questions connexes:

39
DaveRandom

Erreur fatale: Impossible de redéclarer la classe [nom de la classe]

Erreur fatale: Impossible de redéclarer [nom de la fonction]

Cela signifie que vous utilisez le même nom de fonction/classe à deux reprises et que vous devez renommer l’un d’eux, ou bien c’est parce que vous avez utilisé require ou include où vous devriez utiliser require_once ou include_once.

Quand une classe ou une fonction est déclarée en PHP, elle est immuable et ne peut plus être déclarée avec une nouvelle valeur.

Considérons le code suivant:

class.php

<?php

class MyClass
{
    public function doSomething()
    {
        // do stuff here
    }
}

index.php

<?php

function do_stuff()
{
   require 'class.php';
   $obj = new MyClass;
   $obj->doSomething();
}

do_stuff();
do_stuff();

Le deuxième appel à do_stuff() produira l'erreur ci-dessus. En remplaçant require par require_once, nous pouvons être certains que le fichier contenant la définition de MyClass ne sera chargé qu'une fois et que l'erreur sera évitée.

39
DaveRandom

Avis: Variable non définie

Cela se produit lorsque vous essayez d'utiliser une variable qui n'était pas définie auparavant.

Un exemple typique serait

foreach ($items as $item) {
    // do something with item
    $counter++;
}

Si vous n'avez pas défini $counter auparavant, le code ci-dessus déclenchera la notification.

La bonne façon serait de définir la variable avant de l’utiliser, même si c’est juste une chaîne vide comme 

$counter = 0;
foreach ($items as $item) {
    // do something with item
    $counter++;
}

Questions connexes:

36
aleation

Erreur d'analyse: erreur de syntaxe, T_VARIABLE inattendu

Scénario possible

Je n'arrive pas à trouver où mon code a mal tourné. Voici mon erreur complète:

Erreur d'analyse: erreur de syntaxe, T_VARIABLE inattendu sur la ligne x

Ce que j'essaye 

$sql = 'SELECT * FROM dealer WHERE id="'$id.'"';

Réponse

Erreur d'analyse: Un problème de syntaxe de votre programme, tel que laisser un point-virgule à la fin d'une instruction ou, comme dans le cas ci-dessus, manquer l'opérateur .. L'interpréteur arrête l'exécution de votre programme lorsqu'il rencontre une erreur d'analyse.

En termes simples, il s'agit d'une erreur de syntaxe, ce qui signifie qu'il y a quelque chose dans votre code qui l'empêche d'être correctement analysé et donc exécuté.

Ce que vous devriez faire est de vérifier soigneusement les lignes autour desquelles se trouve l’erreur pour de simples erreurs.

Ce message d'erreur signifie que, sur la ligne x du fichier, l'interpréteur PHP s'attendait à voir une parenthèse ouverte, mais à la place, il a rencontré quelque chose appelé T_VARIABLE. Cette chose T_VARIABLE s'appelle une token. C'est la manière dont l'interprète PHP exprime différentes parties fondamentales des programmes. Lorsque l'interprète lit dans un programme, il traduit ce que vous avez écrit dans une liste de jetons. Où que vous mettiez une variable dans votre programme, il y a un jeton T_VARIABLE dans la liste de l'interpréteur.

Bonne lecture: liste des jetons d'analyse

Veillez donc à activer au moins E_PARSE dans votre php.ini. Les erreurs d'analyse ne doivent pas exister dans les scripts de production.

J'ai toujours recommandé d'ajouter l'énoncé suivant lors du codage:

error_reporting(E_ALL);

PHP compte rendu d'erreur

Aussi, une bonne idée d’utiliser un IDE qui vous permettra de connaître les erreurs d’analyse lors de la frappe. Vous pouvez utiliser:

  1. NetBeans (un beau morceau de beauté, logiciel libre) (le meilleur à mon avis)
  2. PhpStorm (mon oncle Gordon aime ça: P, plan payé, contient un logiciel propriétaire et libre)
  3. Eclipse (La Belle et la Bête, logiciel libre)

Questions connexes:

31
NullPoiиteя

Avis: décalage de chaîne non initialisé: *

Comme son nom l'indique, ce type d'erreur se produit lorsque vous essayez probablement de parcourir ou de rechercher une valeur dans un tableau avec une clé non existante. 

Considérez-vous, essayez de montrer chaque lettre de $string 

$string = 'ABCD'; 
for ($i=0, $len = strlen($string); $i <= $len; $i++){
    echo "$string[$i] \n"; 
}

L'exemple ci-dessus générera ( démo en ligne ):

A
B
C
D
Notice: Uninitialized string offset: 4 in XXX on line X

Et, dès que le script aura terminé l'écho de D, vous obtiendrez l'erreur, car dans la boucle for(), vous avez dit à PHP de vous montrer le caractère de la première à la cinquième chaîne de 'ABCD' la boucle commence à compter à partir de 0 et renvoie D au moment où elle atteint 4, une erreur de décalage est générée. 

Erreurs similaires:

31
samayo

Attention: restriction open_basedir en vigueur

Cet avertissement peut apparaître avec diverses fonctions liées à l'accès aux fichiers et aux répertoires. Il met en garde contre un problème de configuration.

Quand il apparaît, cela signifie que l'accès à certains fichiers a été interdit.

L'avertissement lui-même ne casse rien, mais le plus souvent, un script ne fonctionne pas correctement si l'accès aux fichiers est empêché. 

Le correctif consiste normalement à modifier la configuration PHP , le paramètre associé est appelé open_basedir .

Parfois, des noms de fichiers ou de répertoires incorrects sont utilisés, la solution consiste alors à utiliser les bons.

Questions connexes:

28
hakre

Erreur d'analyse: erreur de syntaxe, '[' inattendu

Cette erreur vient en deux variantes:

Variation 1

$arr = [1, 2, 3];

Cette syntaxe d'initialiseur de tableau n'a été introduite que dans PHP 5.4; il y aura une erreur d'analyse sur les versions antérieures à cela. Si possible, mettez à niveau votre installation ou utilisez l'ancienne syntaxe:

$arr = array(1, 2, 3);

Voir aussi cet exemple du manuel.

Variation 2

$suffix = explode(',', 'foo,bar')[1];

Les résultats de la fonction de déréférencement de tableaux ont également été introduits dans PHP 5.4. S'il n'est pas possible de mettre à niveau, vous devez utiliser une variable (temporaire):

$parts = explode(',', 'foo,bar');
$suffix = $parts[1];

Voir aussi cet exemple du manuel.

26
Ja͢ck

Avis: Essayer d'obtenir une propriété d'erreur non-objet

Cela se produit lorsque vous essayez d'accéder à une propriété d'un objet alors qu'il n'y a pas d'objet.

Un exemple typique pour un avis non-objet serait

$users = json_decode('[{"name": "hakre"}]');
echo $users->name; # Notice: Trying to get property of non-object

Dans ce cas, $users est un tableau (donc pas un objet) et il n’a aucune propriété.

Ceci est similaire à l'accès à un index non existant ou à la clé d'un tableau (voir Remarque: Index non défini ).

Cet exemple est beaucoup simplifié. Le plus souvent, une telle notification signale une valeur de retour non contrôlée, par ex. lorsqu'une bibliothèque renvoie NULL si un objet n'existe pas ou juste une valeur non-objet inattendue (par exemple, dans un résultat Xpath, des structures JSON avec un format inattendu, XML avec un format inattendu, etc.) mais le code ne recherche pas une telle condition.

Comme ces non-objets sont souvent traités ultérieurement, une erreur fatale se produit souvent lors de l'appel d'une méthode d'objet sur un non-objet (voir: Erreur fatale: appel d'une fonction membre ... sur un non-objet ) arrêter le script.

On peut facilement l'éviter en vérifiant les conditions d'erreur et/ou qu'une variable correspond à une attente. Voici un tel avis avec un exemple DOMXPath:

$result  = $xpath->query("//*[@id='detail-sections']/div[1]");
$divText = $result->item(0)->nodeValue; # Notice: Trying to get property of non-object

Le problème est d'accéder à la propriété nodeValue du premier élément alors qu'elle n'a pas été vérifiée si elle existe ou non dans la collection $result. Au lieu de cela, il est utile de rendre le code plus explicite en affectant des variables aux objets sur lesquels le code agit:

$result  = $xpath->query("//*[@id='detail-sections']/div[1]");
$div     = $result->item(0);
$divText = "-/-";
if (is_object($div)) {
    $divText = $div->nodeValue;
}
echo $divText;

Erreurs connexes:

25
hakre

Avertissement: [fonction] s'attend à ce que le paramètre 1 soit une ressource, booléen

(Une variante plus générale de Attention: mysql_fetch_array () s'attend à ce que le paramètre 1 soit une ressource, boolean étant donné) )

Les ressources sont un type dans PHP (comme des chaînes, des entiers ou des objets). Une ressource est un blob opaque sans valeur intrinsèquement significative. Une ressource est spécifique à et définie par un certain ensemble de fonctions ou d’extensions PHP. Par exemple, l’extension Mysql définit deux types de ressources :

Deux types de ressources sont utilisés dans le module MySQL. Le premier est l'identifiant de lien pour une connexion à une base de données, le second est une ressource qui contient le résultat d'une requête.

L’extension cURL en définit un autre deux types de ressources :

... une poignée cURL et une poignée multi cURL.

Quand var_dumped, les valeurs ressemblent à ceci:

$resource = curl_init();
var_dump($resource);

resource(1) of type (curl)

C'est tout ce que la plupart des ressources sont, un identifiant numérique ((1)) d'un certain type ((curl)).

Vous transportez ces ressources et les transmettez à différentes fonctions pour lesquelles une telle ressource a une signification. Généralement, ces fonctions allouent certaines données en arrière-plan et une ressource est simplement une référence qu’elles utilisent pour suivre ces données en interne.


L'erreur " ... s'attend à ce que le paramètre 1 soit une ressource, booléen étant donné " est généralement le résultat d'une opération non contrôlée censée créer une ressource, mais a retourné falseà la place. Par exemple, la fopenfunction a cette description:

Valeurs de retour

Retourne une ressource de pointeur de fichier en cas de succès, ou FALSEen cas d'erreur.

Donc dans ce code, $fp sera soit resource(x) of type (stream) ou falsename__:

$fp = fopen(...);

Si vous ne vérifiez pas si l'opération fopena réussi ou échoué, et donc si $fp est une ressource valide ou falseet transmettez $fp à une autre fonction qui attend une ressource, vous pouvez obtenir l'erreur ci-dessus:

$fp   = fopen(...);
$data = fread($fp, 1024);

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

Vous devez toujours vérifier par erreur la valeur de retour des fonctions qui essaient d’allouer une ressource et peuvent échouer :

$fp = fopen(...);

if (!$fp) {
    trigger_error('Failed to allocate resource');
    exit;
}

$data = fread($fp, 1024);

Erreurs connexes:

23
deceze

Avertissement: décalage de chaîne illégal 'XXX'

Cela se produit lorsque vous essayez d'accéder à un élément de tableau avec la syntaxe entre crochets, mais que vous le faites sur une chaîne et non sur un tableau, de sorte que l'opération n'a clairement aucun sens.

Exemple:

$var = "test";
echo $var["a_key"];

Si vous pensez que la variable doit être un tableau, voyez d'où elle vient et corrigez le problème.

19
Karoly Horvath

Le code ne fonctionne pas/ce qui semble être une partie de mon code PHP est généré

Si vous ne voyez aucun résultat dans votre code PHP et/ou si vous voyez des parties de votre code source littéral PHP dans la page Web, vous pouvez être à peu près sûr que votre PHP isn ' Je ne suis pas en train de me faire exécuter. Si vous utilisez View Source dans votre navigateur, vous voyez probablement l'intégralité du fichier de code source PHP tel quel. Étant donné que le code PHP est incorporé dans les balises <?php ?>, le navigateur essaiera de les interpréter en tant que balises HTML et le résultat peut sembler quelque peu confus.

Pour exécuter vos scripts PHP, vous avez besoin des éléments suivants:

  • un serveur web qui exécute votre script
  • pour définir l'extension de fichier sur .php, sinon le serveur Web ne l'interprétera pas comme tel *
  • accéder à votre fichier .php via le serveur Web

* Sauf si vous le reconfigurez, tout peut être configuré.

Ce dernier est particulièrement important. Double-cliquer sur le fichier l'ouvrira probablement dans votre navigateur en utilisant une adresse telle que:

file://C:/path/to/my/file.php

Cela évite complètement tout serveur Web en cours d'exécution et le fichier n'est pas interprété. Vous devez visiter l'URL du fichier sur votre serveur Web, probablement quelque chose comme:

http://localhost/my/file.php

Vous pouvez également vérifier si vous utilisez des balises ouvertes courtes <? au lieu de <?php et si votre configuration PHP a désactivé les balises ouvertes courtes.

Voir aussi PHP le code n'est pas en cours d'exécution, le code est affiché à la page

18
deceze

Avis: Conversion de tableau en chaîne

Cela se produit simplement si vous essayez de traiter un tableau comme une chaîne:

$arr = array('foo', 'bar');

echo $arr;  // Notice: Array to string conversion
$str = 'Something, ' . $arr;  // Notice: Array to string conversion

Un tableau ne peut pas simplement être echo 'd ou concaténé avec une chaîne, car le résultat n'est pas bien défini. PHP utilisera la chaîne "Array" à la place du tableau et déclenchera la notification pour préciser que ce n'est probablement pas ce qui était prévu et que vous devriez vérifier votre code ici. Vous voulez probablement quelque chose comme ça à la place:

echo $arr[0];  // displays foo
$str = 'Something ' . join(', ', $arr); //displays Something, foo, bar

Ou boucle le tableau:

foreach($arr as $key => $value) {
    echo "array $key = $value";
    // displays first: array 0 = foo
    // displays next:  array 1 = bar
}

Si cet avis apparaît quelque part où vous ne vous attendez pas, cela signifie qu'une variable que vous pensiez être une chaîne est en réalité un tableau. Cela signifie que votre code contient un bogue qui fait de cette variable un tableau au lieu de la chaîne attendue.

15
deceze

Avertissement: Division par zéro

Le message d'avertissement 'Division par zéro' est l'une des questions les plus fréquemment posées par les nouveaux développeurs PHP. Cette erreur ne provoquera pas d'exception. Par conséquent, certains développeurs suppriment parfois l'avertissement en ajoutant l'opérateur de suppression d'erreur @ avant l'expression. Par exemple:

$value = @(2 / 0);

Mais, comme pour tout avertissement, la meilleure approche serait de rechercher la cause de l'avertissement et de le résoudre. La cause de l'avertissement proviendra de toute instance dans laquelle vous tentez de diviser par 0, une variable égale à 0 ou une variable non affectée (car NULL == 0), car le résultat sera "indéfini".

Pour corriger cet avertissement, vous devez réécrire votre expression pour vérifier que la valeur n'est pas 0. Si c'est le cas, effectuez autre chose. Si la valeur est égale à zéro, vous ne devez pas diviser ou modifier la valeur en 1, puis diviser pour que la division donne l'équivalent d'avoir divisé uniquement par la variable supplémentaire.

if ( $var1 == 0 ) { // check if var1 equals zero
    $var1 = 1; // var1 equaled zero so change var1 to equal one instead
    $var3 = ($var2 / $var1); // divide var1/var2 ie. 1/1
} else {
    $var3 = ($var2 / $var1); // if var1 does not equal zero, divide
}

Questions connexes:

11
davidcondrey

Normes strictes: la méthode non statique [<class> :: <méthode>] ne doit pas être appelée de manière statique

Se produit lorsque vous essayez d'appeler une méthode non statique sur une classe car elle était statique, et que vous avez également l'indicateur E_STRICT dans vos paramètres error_reporting().

Exemple :

class HTML {
   public function br() {
      echo '<br>';
   }
}

HTML::br() ou $html::br()

Vous pouvez réellement éviter cette erreur en n’ajoutant pas E_STRICT à error_reporting(), par exemple:

error_reporting(E_ALL & ~E_STRICT);

comme pour PHP 5.4.0 et supérieur, E_STRICT est inclus dans E_ALL [ ref ]. Mais ce n'est pas conseillé. La solution consiste à définir votre fonction statique souhaitée comme étant la variable static réelle:

public static function br() {
  echo '<br>';
}

ou appelez la fonction de manière conventionnelle:

$html = new HTML();
$html->br();

Questions connexes : 

8
davidkonrad

Erreur fatale: [TraitA] et [TraitB] définissent la même propriété ([$ x]) dans la composition de [ClassC]

Se produit lorsqu'une classe tente de use plusieurs traits , lorsque deux ou plusieurs de ces traits ont défini une propriété du même nom et que la propriété a des valeurs initiales différentes.

Exemple:

<?php
trait TraitA
{
    public $x = 'a';
}
trait TraitB
{
    public $x = 'b';
}
class ClassC
{
    use TraitA, TraitB;
}

Problématique: Bien qu'il soit possible de résoudre les conflits entre méthodes concurrentes , il n'existe actuellement aucune syntaxe permettant de résoudre un conflit entre deux propriétés concurrentes. La seule solution pour le moment est de refactor ; En d’autres termes, évitez un conflit entre les noms de propriété qui produit une erreur fatale.


Questions connexes:

3
jaswrks

Erreur HTTP 500 - Erreur de serveur interne

Le code d'état HTTP 500 et l'avertissement type d'Apache ou du navigateur constituent un message très large. Ce n'est pas l'erreur réelle. Pour savoir s’il s’agit d’une mauvaise configuration du serveur Web (.htaccess) ou d’une erreur fatale PHP, vous devez consulter le error.log.

Vous pouvez généralement trouver les serveurs Web error.log sous:

  • /var/log/Apache2 sur les serveurs Linux, souvent utilisé pour les hôtes locaux et virtuels.
  • /var/www/_user12345_/logs ou similaire sur les plans d'hébergement partagé.
    Il y a généralement un répertoire logs/ à côté de chaque dossier htdocs/.
  • C:\xampp\Apache\logs\error.log pour WAMP / XAMPP distributions d'Apache + PHP.
  • Vous pouvez également utiliser une fonction de recherche de fichier pour localiser un élément appelé "error.log".
    Ou examinez votre httpd.conf Apache et sa directive ErrorLog.
  • /var/log/nginx/nginx_error.log pour NGINX .
  • C:\inetpub\logs\LogFiles pour IIS .

C'est un fichier texte. Recherchez l'entrée qui correspond le mieux au temps d'erreur et utilisez la partie significative du message d'erreur (de "Erreur PHP:…" jusqu'à "en ligne ...") pour continuer à chercher dans Google.

[Mon 22:10] [:error] [pid 12345] [client 127.0.0.1] FastCGI: server "/fcgi/p73" stderr: PHP message:PHP Error: Unfiltered inputvariable $_JSON['pokestop_lng'] in filyfile.php on line 845

Pour les configurations FPM, vous verrez souvent des erreurs fatales PHP ici. Tandis que les anciennes configurations mod_php (hébergement partagé) combinent souvent des avertissements et des notifications (qui valent généralement la peine d’être inspectées).

S'il n'est pas configuré pour utiliser le système ou le mécanisme de journalisation Apache, vous pouvez également consulter le fichier error.log de PHP. Généralement, il est plus simple de laisser les valeurs par défaut et d'activer simplement error_display + error_reporting pour révéler l'erreur concrète. Après tout, la page de capture HTTP 500 n’est qu’une variante de l’écran blanc de la mort de PHP .

Voir également:

3
mario

Erreur fatale: l'objet de la classe Closure n'a pas pu être converti en chaîne.

Cela signifie que vous n'exécutez pas votre fonction anonyme (ou une fermeture).

Une erreur sera générée pour cet exemple en utilisant les fonctions de flèche:

echo $fn = fn($x = 42) => $x;

Ou pour toute fonction anonyme

echo function($x = 42) { return $x; };

Pour résoudre cette erreur, vous devez exécuter la fermeture.

echo $fn = (fn($x = 42) => $x)(30); // take notice of the 2 sets of brackets

echo (function($x = 42) { return $x; })(30);

Ce type de syntaxe s'appelle IIFE et c'était ajouté dans PHP 7 .

3
Dharman

Avertissement: function () s'attend à ce que le paramètreXsoit booléen (ou entier, chaîne, etc.)

Si un type de paramètre incorrect est transmis à une fonction - et que PHP ne peut pas la convertir automatiquement - un avertissement est émis. Cet avertissement identifie quel paramètre est le problème et quel type de données est attendu. La solution: remplacez le paramètre indiqué par le type de données correct.


Par exemple ce code:

echo substr(["foo"], 23);

Résultats dans cette sortie:

Avertissement PHP: substr () s'attend à ce que le paramètre 1 soit une chaîne, un tableau donné

1
miken32

Avertissement: count (): le paramètre doit être un tableau ou un objet qui implémente Countable in ...

Auto-explicatif; le paramètre transmis à la fonction count() doit être quelque chose de dénombrable, généralement un tableau.

Le problème probable est qu'une valeur scalaire telle qu'une chaîne ou un entier a été transmise ou un objet qui n'implémente pas l'interface Countable. L'utilisation de var_dump() sur la variable en question peut indiquer si c'est le cas ou non.

0
miken32