Qu'est-ce que c'est?
Il s'agit d'un certain nombre de réponses concernant les avertissements, les erreurs et les notifications que vous pourriez rencontrer lors de la programmation de PHP et vous ne savez pas comment les corriger. Il s'agit également d'un wiki communautaire, donc 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 «Appeler un membre d'un non-objet» apparaissent fréquemment sur Stack Overflow. La cause profonde de ces questions est toujours la même. Ainsi, les réponses à ces questions les répètent généralement, puis indiquent à l'OP la ligne à modifier dans leur cas particulier. Ces réponses n'ajoutent aucune valeur au site car elles ne s'appliquent qu'au code particulier de l'OP. D'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 profonde, 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 dois-je faire ici?
Si votre question a été marquée comme doublon de celle-ci, veuillez trouver votre message d'erreur ci-dessous et appliquer le correctif à votre code. Les réponses contiennent généralement d'autres liens à rechercher au cas où cela ne devrait pas être clair à partir de la seule réponse générale.
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 ce que cela signifie (même si cela ne fait que mettre en évidence les termes sur leur page de manuel), une solution possible ou une approche de débogage et une liste des questions et réponses existantes qui ont de la valeur. N'hésitez pas non plus à améliorer les réponses existantes.
La liste
- On ne voit rien. La page est vide et blanche. (également connu sous le nom de White Page / Screen Of Death )
- Le code ne fonctionne pas / ce qui ressemble à des parties de mon code PHP sont sorties
- Avertissement: impossible de modifier les informations d'en-tête - en-têtes déjà envoyés
- Avertissement: mysql_fetch_array () attend le paramètre 1 être ressource, donnée booléenne alias
Warning: mysql_fetch_array (): argument fourni est pas une ressource de résultat MySQL valide aka
Avertissement: mysqli_num_rows () attend le paramètre 1 être mysqli_result, booléennes donné (ou variations similaires) - Avertissement: [fonction] s'attend à ce que le paramètre 1 soit une ressource, un booléen étant donné
- Avertissement: [fonction] : échec d'ouverture du flux: [raison]
- Avertissement: la restriction open_basedir est en vigueur
- Avertissement: division par zéro
- Avertissement: décalage de chaîne illégal «XXX»
- Avertissement: count (): le paramètre doit être un tableau ou un objet qui implémente Countable
- Erreur d'analyse: erreur de syntaxe, '[' inattendu
- Erreur d'analyse: erreur de syntaxe, T_XXX inattendu
- Erreur d'analyse: erreur de syntaxe, T_ENCAPSED_AND_WHITESPACE inattendu
- Erreur d'analyse: erreur de syntaxe, T_PAAMAYIM_NEKUDOTAYIM inattendu
- Erreur d'analyse: erreur de syntaxe, 'require_once' (T_REQUIRE_ONCE) inattendu, fonction en attente (T_FUNCTION)
- Erreur d'analyse: erreur de syntaxe, T_VARIABLE inattendu
- Erreur fatale: taille de mémoire autorisée de XXX octets épuisée (tentative d'allocation de XXX octets)
- Erreur fatale: appel à une fonction membre ... sur un non-objet ou null
- Erreur fatale: appel à la fonction non définie XXX
- Erreur fatale: impossible de redéclarer XXX
- Erreur fatale: impossible d'utiliser la valeur de retour de la fonction dans le contexte d'écriture
- Erreur fatale: la déclaration de AAA :: BBB () doit être compatible avec celle de CCC :: BBB () '
- Erreur fatale: utilisation de $ this en dehors du contexte de l'objet
- Erreur fatale: l'objet de la classe Closure n'a pas pu être converti en chaîne
- Erreur fatale: constante de classe non définie
- Remarque: conversion de tableau en chaîne
- Remarque: essayer d'obtenir la propriété d'une erreur non liée à un objet
- Remarque: variable ou propriété non définie
- Remarque: Index non défini
- Remarque: décalage indéfini XXX [Référence]
- Remarque: décalage de chaîne non initialisé: XXX
- Remarque: utilisation de la constante XXX non définie - supposé «XXX»
- MySQL: vous avez une erreur dans votre syntaxe SQL; consultez le manuel qui correspond à votre version de serveur MySQL pour la bonne syntaxe à utiliser près de ... en ligne ...
- Normes strictes: la méthode non statique [<class> :: <method>] ne doit pas être appelée statiquement
- Avertissement: la fonction s'attend à ce que le paramètre X soit booléen / chaîne / entier
- Erreur HTTP 500 - Erreur de serveur interne
- Obsolète: la syntaxe d'accès aux décalages de tableau et de chaîne avec accolades est déconseillée
Regarde aussi:
Réponses:
Avertissement: impossible de modifier les informations d'en-tête - en-têtes déjà envoyés
Se produit lorsque votre script essaie d'envoyer un en-tête HTTP au client mais qu'il y avait déjà une sortie avant, ce qui a entraîné l'envoi déjà des en-têtes au client.
C'est un
E_WARNING
et cela n'arrêtera pas le script.Un exemple typique serait un fichier modèle comme celui-ci:
La
session_start()
fonction essaiera d'envoyer des en-têtes avec le cookie de session au client. Mais PHP a déjà envoyé des en-têtes lorsqu'il a écrit l'<html>
élément dans le flux de sortie. Vous devez déplacersession_start()
le haut.Vous pouvez résoudre ce problème en parcourant les lignes avant le code déclenchant l'avertissement et vérifiez où il sort. Déplacez tout 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?>
lorsqu'il s'agit de la dernière chose dans le fichier. De même, une autre cause courante de cet avertissement est lorsque l'ouverture<?php
a un espace, une ligne ou un caractère invisible devant elle, obligeant le serveur Web à envoyer les en-têtes et le blanc / la nouvelle ligne, ainsi lorsque PHP commence l'analyse, il ne pourra pas soumettre n'importe quel en-tête.Si votre fichier contient plus d'un
<?php ... ?>
bloc de code, vous ne devriez pas avoir d'espace entre eux. (Remarque: vous pourriez avoir plusieurs blocs si vous aviez du code qui a été construit automatiquement)Assurez-vous également que vous n'avez pas de marques d'ordre d'octets dans votre code, par exemple lorsque l'encodage du script est UTF-8 avec BOM.
Questions connexes:
la source
<?php ?>
et donc "plus d'un bloc" le serait<?php ?> <?php ?>
?Erreur fatale: appel à une fonction membre ... sur un non-objet
Se produit avec un code similaire à
xyz->method()
oùxyz
n'est pas un objet et quimethod
ne peut donc pas être appelé.Il s'agit d'une erreur fatale qui arrêtera le script (avis de compatibilité ascendante: il deviendra une erreur capturable à partir de PHP 7).
Le plus souvent, cela indique que le code manque de vérifications des conditions d'erreur. Validez qu'un objet est réellement un objet avant d'appeler ses méthodes.
Un exemple typique serait
Dans l'exemple ci-dessus, la requête ne peut pas être préparée et
prepare()
sera affectéefalse
à$statement
. Essayer d'appeler laexecute()
méthode entraînera alors l'erreur fatale car ilfalse
s'agit d'un "non-objet" car la valeur est un booléen.Découvrez pourquoi votre fonction a renvoyé un booléen au lieu d'un objet. Par exemple, vérifiez l'
$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 gérées pour la fonction / l'objet / la classe en question.Si même l'
->prepare
échec, votre$pdo
objet de poignée de base de données n'a pas été transmis dans la portée actuelle . Trouvez où cela 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'appel d'une méthode en dehors de ce bloc conditionnel. Par exemple
En tentant d'exécuter la méthode en dehors du bloc conditionnel, votre objet peut ne pas être défini.
Questions connexes:
la source
On ne voit rien. La page est vide et blanche.
Également connu sous le nom de White Page Of Death ou White Screen Of Death . 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 exemple
/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é).Parfois, il peut être plus simple d'activer temporairement l'affichage des erreurs. La page blanche affichera alors le message d'erreur. 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:
Le code activera l'affichage des erreurs et réglera le rapport au niveau le plus élevé.
Étant donné que le
ini_set()
est exécuté au moment de 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 ladisplay_startup_errors
directive surtrue
. Pour ce faire, dansphp.ini
ou dans une.htaccess
ou par toute autre méthode qui affecte la configuration avant l' exécution .Vous pouvez utiliser les mêmes méthodes pour définir les log_errors et error_log directives pour choisir votre propre emplacement du fichier journal.
En regardant dans le journal ou en utilisant l'affichage, vous obtiendrez un message d'erreur bien meilleur et la ligne de code où votre script s'arrêtera.
Questions connexes:
Erreurs liées:
la source
error_reporting(~0);
pourquoi pas-1
? C'est ce qui est~0
évalué et est beaucoup moins cryptique.~0
est IMO plus explicite: annuler le jeu de bits vide, c'est-à-dire activer tous les drapeaux. -1 n'est pas censé signifier «introuvable» comme dans strpos () en C, mais comme un ensemble de bits avec tous les drapeaux définis, car -1 est binaire1111'1111'1111'1111
(pour 32 bits).1111'1111'1111'1111
c'est vraiment 16 bits, mais j'espère que vous comprenez ce que je veux dire.E_STRICT
n'est pas inclus dansE_ALL
. php.net/manual/en/errorfunc.constants.php et faites défiler jusqu'àE_STRICT
.Remarque: Index non défini
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
avis serait ( démo )Les deux
spinach
et1
n'existent pas dans le tableau, provoquantE_NOTICE
le déclenchement d'un.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 vous y attendez. Ou cela peut signifier que vous devez tester si les index existent en utilisant
array_key_exists
ouisset
:Si vous avez du code comme:
alors
$_POST['message']
ne sera pas défini lors du premier chargement de cette page 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:Questions connexes:
la source
if(!empty($_POST['message'])){ //do stuff }
Avertissement: mysql_fetch_array () s'attend à ce que le paramètre 1 soit une ressource, booléen étant donné
Tout d'abord:
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 retourné par
mysql_query
parQuestions connexes:
Erreurs liées:
D'autres
mysql*
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.la source
mysql_query
n'est pas assez mauvais, l'ajouteror die
au-dessus ajoute de l'insulte à la blessure.$res = mysql_query($query)
retourne 1 si la requête réussit donc elle est considérée comme vraie. Par conséquent , lors du passage du résultat demysql_query
àmysql_fetch_array()
des spectacles de préavis.mysql_fetch_array() expects parameter 1 to be resource, boolean given in select
veuillez consulter - gist.github.com/romelemperado/93af4cdbd44ebf3a07cbfa0e3fc539d7 Une suggestion pour supprimer cette erreur?mysql_fetch_array()
est pour la requête de sélection, pour l'insertion et la mise à jour, vous n'avez pas besoin de récupérer l'ensemble de résultats (et aucun ensemble de résultats ne vous permet de récupérer).Erreur fatale: utilisation de $ this en dehors du contexte de l'objet
$this
est une variable spéciale en PHP qui ne peut pas être affectée. S'il est accédé dans un contexte où il n'existe pas, cette erreur fatale est donnée.Cette erreur peut se produire:
Si une méthode non statique est appelée statiquement. Exemple:
Comment résoudre ce problème: vérifiez à nouveau votre code,
$this
il 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. Utilisezself::$static_property
pour accéder à la propriété statique.Si le code d'une méthode de classe a été copié dans une fonction normale ou simplement la portée globale et en conservant la
$this
variable spéciale.Résolution des problèmes: passez en revue le code et remplacez-le
$this
par une autre variable de substitution.Questions connexes:
la source
$closure = function() { self::method(); }
.$this
vous pouvez déclencher le message d' erreur "Erreur fatale: utiliser $ this en$closure = function() { $this->method(); };
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 courantes incluent les extensions et inclusions manquantes, la déclaration de fonction conditionnelle, la fonction dans une déclaration de fonction ou les fautes de frappe simples.
Exemple 1 - Déclaration de fonction conditionnelle
Dans ce cas,
fn()
ne sera jamais déclaré car ce$someCondition
n'est pas vrai.Exemple 2 - Fonction dans la déclaration de fonction
Dans ce cas,
fn
ne sera déclaré qu'une foiscreateFn()
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 de PHP. Essayez de rechercher la fonction dans le manuel officiel , et vérifiez à quelle "extension" (module PHP) elle appartient et quelles versions de PHP la prennent en charge.
En cas d'une extension manquante, installez cette extension et activez-la dans php.ini. Reportez-vous aux instructions d'installation dans le manuel PHP pour l'extension dans laquelle votre fonction apparaît. Vous pouvez également activer ou installer l'extension en utilisant 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 sa section commentaire. S'il a été supprimé de PHP, recherchez des informations sur la raison, car il n'est peut-être plus 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 faute de frappe, corrigez la faute de frappe.
Questions connexes:
la source
Erreur d'analyse: erreur de syntaxe, T_XXX inattendu
Cela se produit lorsque vous avez un
T_XXX
jeton dans un endroit inattendu, des parenthèses déséquilibrées (superflues), l'utilisation d'une balise courte sans l'activer dans php.ini, et bien d'autres.Questions connexes:
Pour plus d'aide, voir:
la source
Erreur fatale: impossible d'utiliser la valeur de retour de la fonction dans le contexte d'écriture
Cela se produit généralement lorsque vous utilisez une fonction directement avec
empty
.Exemple:
En effet,
empty
étant une construction de langage et non une fonction, elle ne peut pas être appelée avec une expression comme argument dans les versions PHP antérieures à 5.5. Avant PHP 5.5, l'argument toempty()
doit être une variable , mais une expression arbitraire (telle qu'une valeur de retour d'une fonction) est autorisée en 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 (commeis_null(null)
dans l'exemple) seront toujours réputées exister, donc voiciempty
seulement vérifier si elles sont égales à false. Vous pouvez remplacerempty()
ici par!
, par exempleif (!is_null(null))
, ou comparer explicitement à faux, par exempleif (is_null(null) == false)
.Questions connexes:
la source
MySQL: vous avez une erreur dans votre syntaxe SQL; consultez le manuel qui correspond à votre version de serveur MySQL pour la bonne syntaxe à utiliser près de ... en ligne ...
Cette erreur est souvent due au fait que vous avez oublié d'échapper correctement les données transmises à une requête MySQL.
Un exemple de ce qu'il ne faut pas faire (la "mauvaise idée"):
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
se retrouvera avec:Et lorsque cette requête est envoyée à MySQL, il se plaindra que la syntaxe est incorrecte, car il y a une citation supplémentaire au milieu.
Pour éviter de telles erreurs, vous DEVEZ toujours échapper les données avant de les utiliser 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 l'altération, la perte ou la modification d'un enregistrement, d'une table ou d'une base de données entière. Il s'agit d'un problème de sécurité très grave!
Documentation:
mysql_real_escape_string()
mysqli_real_escape_string()
la source
Erreur fatale: taille de mémoire autorisée de XXX octets épuisée (tentative d'allocation de XXX octets)
La mémoire est insuffisante 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 la limite de mémoire peut être configurée soit dans le
php.ini
fichier, soit en utilisantini_set('memory_limit', '128 M');
dans le script (qui écrasera la valeur définie dansphp.ini
). Le but de la limite de mémoire est d'empêcher un seul script PHP d'avaler toute la mémoire disponible et d'arrêter 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 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érer les enregistrements de base de données un par un sans les stocker tous en mémoire. Cela nécessite un peu de conscience conceptuelle de ce qui se passe dans les coulisses et du moment où les données sont stockées en mémoire par rapport à ailleurs.
Si cette erreur s'est produite alors que votre script ne faisait pas de travail gourmand en mémoire, vous devez vérifier votre code pour voir s'il y a une fuite de mémoire. La
memory_get_usage
fonction est votre ami.Questions connexes:
la source
Erreur d'analyse: erreur de syntaxe, T_ENCAPSED_AND_WHITESPACE inattendu
Cette erreur est le plus souvent rencontrée lorsque vous essayez de référencer une valeur de tableau avec une clé entre guillemets pour l'interpolation à l'intérieur d'une chaîne entre guillemets lorsque la construction de variable complexe entière n'est pas incluse dans
{}
.Le cas d'erreur:
Cela se traduira par
Unexpected T_ENCAPSED_AND_WHITESPACE
:Corrections possibles:
Dans une chaîne entre guillemets doubles, PHP permettra aux chaînes de clés de tableau d'être utilisées sans guillemets et n'émettra pas de
E_NOTICE
. Donc, ce qui précède pourrait être écrit comme suit:L'ensemble de la variable de tableau complexe et des clés peut être inclus
{}
, auquel cas ils doivent être cités pour éviter unE_NOTICE
. La documentation PHP recommande cette syntaxe pour les variables complexes.Bien sûr, l'alternative à l' une des options ci-dessus consiste à concaténer la variable de tableau au lieu de l'interpoler:
Pour référence, consultez la section sur l' analyse des variables dans la page de manuel PHP Strings
la source
Avertissement: [fonction] : échec d'ouverture du flux: [raison]
Cela se produit lorsque vous appelez un fichier généralement par
include
,require
oufopen
et que PHP n'a pas pu trouver le fichier ou n'a pas les autorisations suffisantes pour charger le fichier.Cela peut se produire pour diverses raisons:
Une erreur courante est de ne pas utiliser de chemin absolu. Cela peut être facilement résolu en utilisant un chemin complet ou des constantes magiques comme
__DIR__
oudirname(__FILE__)
:ou:
S'assurer que le bon chemin est utilisé est une étape dans le dépannage de ces problèmes, cela peut également être lié à des fichiers non existants, aux droits du système de fichiers empêchant l'accès ou à des restrictions basées sur openir par PHP lui-même.
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 liées:
la source
Erreur d'analyse: erreur de syntaxe, T_PAAMAYIM_NEKUDOTAYIM inattendu
L'opérateur de résolution de portée est également appelé "Paamayim Nekudotayim" de l'hébreu פעמיים נקודתיים. ce qui signifie "double colon".
Cette erreur se produit généralement si vous insérez
::
votre code par inadvertance .Questions connexes:
Documentation:
la source
a()::b;
ou$a=::;
.Remarque: utilisation de la constante XXX non définie - supposé «XXX»
ou, en PHP 7.2 ou supérieur:
Avertissement: utilisation de la constante XXX non définie - supposé "XXX" (cela générera 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 une constante de ce nom n'est pas définie.
L'une des causes les plus courantes de cet avis est le fait de ne pas citer une chaîne utilisée comme clé de tableau associatif.
Par exemple:
Une autre cause courante est un
$
signe (dollar) manquant devant un nom de variable:Ou peut-être avez-vous mal orthographié une autre constante ou un autre mot clé:
Cela peut également être le signe qu'une extension ou bibliothèque PHP nécessaire est manquante lorsque vous essayez d'accéder à une constante définie par cette bibliothèque.
Questions connexes:
la source
Erreur fatale: impossible de redéclarer la classe [nom de classe]
Erreur fatale: impossible de redéclarer [nom de la fonction]
Cela signifie que vous utilisez le même nom de fonction / classe deux fois et que vous devez renommer l'un d'eux, ou c'est parce que vous avez utilisé
require
ouinclude
où vous devriez utiliserrequire_once
ouinclude_once
.Lorsqu'une classe ou une fonction est déclarée en PHP, elle est immuable et ne peut pas être déclarée ultérieurement avec une nouvelle valeur.
Considérez le code suivant:
class.php
index.php
Le deuxième appel à
do_stuff()
produira l'erreur ci-dessus. En changeantrequire
pourrequire_once
, nous pouvons être certains que le fichier contenant la définition deMyClass
ne sera chargé qu'une seule fois, et l'erreur sera évitée.la source
Remarque: variable non définie
Se produit lorsque vous essayez d'utiliser une variable qui n'a pas été définie précédemment.
Un exemple typique serait
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
Remarque: propriété non définie
Cette erreur signifie à peu près la même chose, mais se réfère à une propriété d'un objet. En réutilisant l'exemple ci-dessus, ce code déclencherait l'erreur car la
counter
propriété n'a pas été définie.Questions connexes:
la source
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:
Ce que j'essaye
Réponse
Erreur d'analyse: un problème avec la syntaxe de votre programme, comme 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 d'exécuter 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 analysé correctement et donc de s'exécuter.
Ce que vous devez faire est de vérifier attentivement les lignes autour desquelles se trouve l'erreur pour toute erreur simple.
Ce message d'erreur signifie qu'à 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
. CetteT_VARIABLE
chose s'appelle untoken
. C'est la façon dont l'interpréteur PHP exprime différentes parties fondamentales des programmes. Lorsque l'interprète lit dans un programme, il traduit ce que vous avez écrit en une liste de jetons. Partout où vous mettez une variable dans votre programme, il y a unT_VARIABLE
jeton dans la liste des interprètes.Bonne lecture: Liste des jetons de l'analyseur
Assurez-vous donc d'activer au moins
E_PARSE
dans votrephp.ini
. Les erreurs d'analyse ne doivent pas exister dans les scripts de production.J'ai toujours recommandé d'ajouter la déclaration suivante lors du codage:
Rapport d'erreurs PHP
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:
Questions connexes:
la source
Remarque: décalage de chaîne non initialisé:
*
Comme son nom l'indique, ce type d'erreur se produit lorsque vous essayez très probablement de parcourir ou de trouver une valeur dans un tableau avec une clé non existante.
Considérez-vous, essayez de montrer chaque lettre de
$string
L'exemple ci-dessus va générer ( démo en ligne ):
Et, dès que le script finira de faire écho,
D
vous obtiendrez l'erreur, car à l'intérieur de lafor()
boucle, vous avez dit à PHP de vous montrer le premier à le cinquième caractère de chaîne à partir'ABCD'
duquel, existe, mais puisque la boucle commence à compter0
et fait échoD
au moment où il atteint4
, il générera une erreur de décalage.Erreurs similaires:
la source
Remarque: essayer d'obtenir la propriété d'une erreur non liée à un objet
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 de non-objet serait
Dans ce cas,
$users
c'est un tableau (donc pas un objet) et il n'a aucune propriété.Cela revient à accéder à un index ou à une clé d'un tableau inexistant (voir Remarque: Index non défini ).
Cet exemple est très simplifié. Le plus souvent, une telle notification signale une valeur de retour non vérifiée, par exemple lorsqu'une bibliothèque retourne
NULL
si un objet n'existe pas ou simplement une valeur de 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 vérifie pas une telle condition.Comme ces non-objets sont souvent traités plus loin, une erreur fatale se produit souvent lors de l'appel d'une méthode d'objet sur un non-objet (voir: Erreur fatale: appel à une fonction membre ... sur un non-objet ) arrêtant la scénario.
Il peut être facilement évité en vérifiant les conditions d'erreur et / ou qu'une variable correspond à une attente. Voici un tel avis avec un exemple DOMXPath :
Le problème est d'accéder à la
nodeValue
propriété (champ) du premier élément alors qu'il n'a pas été vérifié s'il existe ou non dans la$result
collection. Au lieu de cela, il est avantageux de rendre le code plus explicite en affectant des variables aux objets sur lesquels le code opère:Erreurs liées:
la source
json_decode
renvoie maintenant une instance destdclass
par défaut, donc l'exemple de code fonctionnerait réellement.json_decode
renvoie maintenant une instance destdclass
par défaut" ? Je ne trouve pas cela dans le changelog.assoc
paramètre est défini sur false. Ce paramètre décide si la fonction renvoie unstdclass
au lieu d'un tableau associatif.json_decode('[{"name": "hakre"}]', true)
retournera un tableau, sinon unstdclass
objetAvertissement: la restriction open_basedir est 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.
Lorsqu'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, les mauvais noms de fichiers ou de répertoires sont utilisés, le correctif consiste à utiliser les bons.
Questions connexes:
la source
Erreur d'analyse: erreur de syntaxe, '[' inattendu
Cette erreur se présente en deux variantes:
Variation 1
Cette syntaxe d'initialisation de tableau n'a été introduite qu'en PHP 5.4; cela soulèvera une erreur d'analyse sur les versions antérieures. Si possible, mettez à niveau votre installation ou utilisez l'ancienne syntaxe:
Voir également cet exemple du manuel.
Variation 2
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):
Voir également cet exemple du manuel.
la source
Avertissement: [fonction] s'attend à ce que le paramètre 1 soit une ressource, un booléen étant donné
(Une variante plus générale de Warning: mysql_fetch_array () s'attend à ce que le paramètre 1 soit une ressource, un booléen étant donné )
Les ressources sont un type en PHP (comme les chaînes, les entiers ou les objets). Une ressource est un blob opaque sans valeur intrinsèque 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 :
L'extension cURL définit deux autres types de ressources :
Lorsqu'elles sont
var_dump
éditées, les valeurs ressemblent à ceci:C'est tout ce que la plupart des ressources sont, un identificateur numérique (
(1)
) d'un certain type ((curl)
).Vous transportez ces ressources et les transmettez à différentes fonctions pour lesquelles une telle ressource signifie quelque chose. Généralement, ces fonctions allouent certaines données en arrière-plan et une ressource n'est qu'une référence qu'elles utilisent pour garder une trace de 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 qui était censée créer une ressource, mais renvoyée à la
false
place. Par exemple, lafopen
fonction a cette description:Donc, dans ce code,
$fp
sera soit unresource(x) of type (stream)
oufalse
:Si vous ne vérifiez pas si l'
fopen
opération a réussi ou échoué et donc s'il$fp
s'agit d'une ressource valide ou si vousfalse
passez$fp
à une autre fonction qui attend une ressource, vous pouvez obtenir l'erreur ci-dessus:Vous devez toujours vérifier la valeur de retour des fonctions qui tentent d'allouer une ressource et peuvent échouer :
Erreurs liées:
la source
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, donc l'opération n'a clairement aucun sens .
Exemple:
Si vous pensez que la variable doit être un tableau, voyez d'où elle vient et corrigez le problème.
la source
Le code ne fonctionne pas / ce qui ressemble à des parties de mon code PHP sont sorties
Si vous ne voyez aucun résultat de votre code PHP et / ou si vous voyez des parties de votre sortie de code source PHP littéral dans la page Web, vous pouvez être sûr que votre PHP n'est pas réellement exécuté. Si vous utilisez View Source dans votre navigateur, vous voyez probablement l'intégralité du fichier de code source PHP tel quel. Comme le code PHP est intégré dans les
<?php ?>
balises, le navigateur essaiera de les interpréter comme des balises HTML et le résultat peut sembler quelque peu confus.Pour exécuter réellement vos scripts PHP, vous avez besoin de:
* Sauf si vous le reconfigurez, tout peut être configuré.
Ce dernier est particulièrement important. Il suffit de double-cliquer sur le fichier pour l'ouvrir dans votre navigateur en utilisant une adresse telle que:
Cela contourne complètement tout serveur Web que vous pourriez avoir 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:
Vous pouvez également vérifier si vous utilisez
<?
plutôt des balises ouvertes courtes<?php
et que votre configuration PHP a désactivé les balises ouvertes courtes.Voir également que le code PHP n'est pas en cours d'exécution, à la place, le code s'affiche sur la page
la source
Avertissement: mysql_connect (): accès refusé pour l'utilisateur 'nom' @ 'hôte'
Cet avertissement s'affiche lorsque vous vous connectez à un serveur MySQL / MariaDB avec des informations d'identification non valides ou manquantes (nom d'utilisateur / mot de passe). Ce n'est donc généralement pas un problème de code, mais un problème de configuration du serveur.
Voir la page de manuel sur
mysql_connect("localhost", "user", "pw")
pour des exemples.Vérifiez que vous avez bien utilisé un
$username
et$password
.(using password: NO)
.Seul le serveur de test local permet généralement de se connecter avec un nom d'utilisateur
root
, aucun mot de passe et letest
nom de la base de données.Vous pouvez tester s'ils sont vraiment corrects en utilisant le client de ligne de commande:
mysql --user="username" --password="password" testdb
Le nom d'utilisateur et le mot de passe sont sensibles à la casse et les espaces ne sont pas ignorés. Si votre mot de passe contient des méta caractères comme
$
, échappez-les ou mettez le mot de passe entre guillemets simples .La plupart des hébergeurs mutualisés prédéclarent les comptes mysql par rapport au compte utilisateur unix (parfois juste des préfixes ou des suffixes numériques supplémentaires). Voir les documents pour un modèle ou une documentation, et CPanel ou toute autre interface pour définir un mot de passe.
Voir le manuel MySQL sur l' ajout de comptes d' utilisateurs à l'aide de la ligne de commande. Une fois connecté en tant qu'administrateur, vous pouvez émettre une requête comme:
CREATE USER 'username'@'localhost' IDENTIFIED BY 'newpassword';
Ou utilisez Adminer ou WorkBench ou tout autre outil graphique pour créer, vérifier ou corriger les détails du compte.
Si vous ne pouvez pas corriger vos informations d'identification, demander à Internet de "s'il vous plaît aider" n'aura aucun effet. Seuls vous et votre hébergeur disposez d'autorisations et d'un accès suffisant pour diagnostiquer et réparer les choses.
Vérifiez que vous pouvez atteindre le serveur de base de données, en utilisant le nom d'hôte donné par votre fournisseur:
ping dbserver.hoster.example.net
Vérifiez cela à partir d'une console SSH directement sur votre serveur Web. Les tests de votre client de développement local vers votre serveur d'hébergement partagé sont rarement significatifs.
Souvent, vous voulez juste que le nom du serveur soit
"localhost"
, qui utilise normalement une socket nommée locale lorsqu'elle est disponible. D'autres fois, vous pouvez essayer"127.0.0.1"
comme solution de rechange .Si votre serveur MySQL / MariaDB écoute sur un port différent, utilisez-le
"servername:3306"
.Si cela échoue, il y a peut-être un problème de pare-feu. (Hors sujet, pas une question de programmation. Pas d'aide à distance possible.)
Lorsque vous utilisez des constantes comme par exemple
DB_USER
ouDB_PASSWORD
, vérifiez qu'elles sont réellement définies .Si vous obtenez un
"Warning: Access defined for 'DB_USER'@'host'"
et un"Notice: use of undefined constant 'DB_PASS'"
, c'est votre problème.Vérifiez que votre exemple a bien
xy/db-config.php
été inclus et ainsi de suite.Vérifiez les
GRANT
autorisations correctement définies .Il ne suffit pas d'avoir une paire
username
+password
.Chaque compte MySQL / MariaDB peut avoir un ensemble d'autorisations attaché.
Ceux-ci peuvent limiter les bases de données auxquelles vous êtes autorisé à vous connecter, à partir de quel client / serveur la connexion peut provenir et quelles requêtes sont autorisées.
L'avertissement "Accès refusé" peut donc également apparaître pour les
mysql_query
appels, si vous n'avez pas les autorisations pourSELECT
une table spécifique, ouINSERT
/UPDATE
, et plus généralementDELETE
n'importe quoi.Vous pouvez adapter les autorisations de compte lorsque vous êtes connecté par client de ligne de commande à l'aide du compte administrateur avec une requête comme:
GRANT ALL ON yourdb.* TO 'username'@'localhost';
Si l'avertissement apparaît en premier avec,
Warning: mysql_query(): Access denied for user ''@'localhost'
vous pouvez avoir une paire compte / mot de passe préconfigurée php.ini .Vérifiez cela
mysql.default_user=
etmysql.default_password=
ayez des valeurs significatives.Il s'agit souvent d'une configuration de fournisseur. Contactez donc leur support pour les décalages.
Retrouvez la documentation de votre hébergeur mutualisé:
par exemple HostGator , GoDaddy , 1and1 , DigitalOcean , BlueHost , DreamHost , MediaTemple , ixWebhosting , lunarhosting , ou tout simplement google vôtre.
Sinon, consultez votre fournisseur d'hébergement Web via leurs canaux d'assistance.
Notez que vous pouvez également avoir épuisé le pool de connexions disponible . Vous obtiendrez des avertissements d'accès refusé pour trop de connexions simultanées. (Vous devez enquêter sur la configuration. C'est un problème de configuration de serveur hors sujet, pas une question de programmation.)
La version de votre client libmysql n'est peut-être pas compatible avec le serveur de base de données. Normalement, les serveurs MySQL et MariaDB peuvent être atteints avec des PHP compilés dans le pilote. Si vous avez une configuration personnalisée, ou une version PHP obsolète, et un serveur de base de données beaucoup plus récent, ou un serveur considérablement obsolète - alors le décalage de version peut empêcher les connexions. (Non, vous devez vous enquêter. Personne ne peut deviner votre configuration).
Plus de références:
la source
Remarque: conversion de tableau en chaîne
Cela se produit simplement si vous essayez de traiter un tableau comme une chaîne:
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 l'avis pour signaler 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:Ou bouclez le tableau:
Si cet avis apparaît quelque part que vous n'attendez pas, cela signifie qu'une variable que vous pensiez être une chaîne est en fait un tableau. Cela signifie que vous avez un bogue dans votre code qui fait de cette variable un tableau au lieu de la chaîne que vous attendez.
la source
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:
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 où vous tentez de diviser par 0, une variable égale à 0 ou une variable qui n'a pas été affectée (car NULL == 0) car le résultat sera `` non dé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, faites autre chose. Si la valeur est zéro, vous ne devez pas diviser, ou vous devez modifier la valeur à 1, puis diviser de sorte que la division entraîne l'équivalent d'avoir divisé uniquement par la variable supplémentaire.
Questions connexes:
la source
$var1
fait == 0, vous pouvez simplement définir$var3
sur$var2
. Même si cela n'est pas fait, le reste n'est pas nécessaire du tout car l'affectation est la même dans les deux cas, donc pas d'autre et attribuez en dehors duif
Normes strictes: la méthode non statique [<class> :: <method>] ne doit pas être appelée statiquement
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'
E_STRICT
indicateur dans voserror_reporting()
paramètres.Exemple :
HTML::br()
ou$html::br()
Vous pouvez réellement éviter cette erreur en ne ajoutant
E_STRICT
paserror_reporting()
, par exemplepuisque comme pour PHP 5.4.0 et supérieur,
E_STRICT
est inclus dansE_ALL
[ ref ]. Mais ce n'est pas conseillé. La solution consiste à définir votre fonction statique prévue comme réellestatic
:ou appelez la fonction de façon conventionnelle:
Questions connexes :
la source
Obsolète: la syntaxe d'accès aux décalages de tableau et de chaîne avec accolades est déconseillée
Les décalages de chaîne et les éléments de tableau étaient accessibles par des accolades
{}
avant PHP 7.4.0:Ceci est obsolète depuis PHP 7.4.0 et génère un avertissement:
Vous devez utiliser des crochets
[]
pour accéder aux décalages de chaîne et aux éléments de tableau:Le RFC de cette modification est lié à un script PHP qui tente de résoudre ce problème mécaniquement.
la source