De référence - Ce qui fait cette erreur signifie en PHP?
Qu'est-ce que cela?
C'est un certain nombre de réponses à propos des avertissements, erreurs, et les avis que vous pourriez rencontrer lors de la programmation PHP et n'ont aucune idée de la façon de les résoudre. C'est aussi une Communauté Wiki, donc tout le monde est invité à participer, l'ajout et le maintien de cette liste.
Pourquoi est-ce?
Des Questions comme "Headers already sent" ou "Appeler un membre d'un non-objet" pop up fréquemment sur un Débordement de Pile. La cause première de ces questions est toujours le même. Si les réponses à ces questions généralement les répéter et de montrer ensuite que l'OP la ligne de changement dans leur cas particulier. Ces réponses ne pas ajouter de la valeur au site parce qu'ils s'appliquent uniquement à l'OP de code particulier. D'autres utilisateurs ayant le même message d'erreur ne peuvent pas lire facilement la solution parce qu'ils sont trop localisée. C'est triste, car une fois que vous avez compris la cause, la fixation de l'erreur est trivial. Par conséquent, cette liste tente d'expliquer la solution d'une manière générale pour s'appliquer.
Que dois-je faire ici?
Si votre question a été marqué comme un doublon de celui-ci, veuillez trouver votre message d'erreur ci-dessous et appliquez le correctif à votre code. Les réponses contiennent généralement plus de liens sont à étudier au cas où il ne devrait pas être du ressort de la réponse générale à lui seul.
Si vous voulez contribuer, s'il vous plaît ajouter vos "favoris" de message d'erreur, d'avertissement ou de l'avis, l'un par réponse, une brève description de ce qu'il signifie (même si c'est seulement en soulignant les conditions de leur page de manuel), une solution possible ou de débogage approche et une liste des existants Q&A qui ont de la valeur. Aussi, n'hésitez pas à améliorer toutes les réponses existantes.
La Liste
- On ne voit rien. La page est vide et blanc. (aussi connu comme Blanc Page/Écran De la Mort)
- Le Code ne fonctionne pas/ce qui ressemble à des parties de mon code PHP sont de sortie
- Warning: Cannot modify header information - headers already sent
- Warning: mysql_fetch_array() s'attend à ce paramètre 1 pour être resource, boolean donné un.k.un.
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource un.k.un.
Avertissement: mysqli_num_rows() s'attend à ce paramètre 1 pour être mysqli_result, booléenne donnée (ou des variations similaires) - Avertissement: [fonction] s'attend à ce paramètre 1 pour être resource, boolean donné
- Avertissement: [fonction]: failed to open stream: [raison]
- Avertissement: open_basedir restriction in effect
- Attention: Division par zéro
- Warning: Illegal string offset 'XXX'
- Avertissement: count(): Paramètre doit être un tableau ou un objet qui implémente Dénombrable
- Parse error: syntax error, unexpected '['
- Parse error: syntax error, unexpected T_XXX
- Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE
- Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM
- Parse error: syntax error, unexpected 'require_once' (T_REQUIRE_ONCE), s'attendant à la fonction (T_FUNCTION)
- Parse error: syntax error, unexpected T_VARIABLE
- Fatal error: Allowed memory size of XXX bytes exhausted (tried to allocate XXX octets)
- Erreur fatale: Appel à une fonction de membre ... sur un non-objet ou la valeur null
- Fatal Error: Call to Undefined function XXX
- Fatal Error: Cannot redeclare XXX
- Erreur fatale: impossible d'utiliser la fonction de valeur de retour à écrire contexte
- Erreur fatale: Déclaration de l'AAA::BBB() doit être compatible avec celle de la CCC::BBB()'
- Erreur fatale: en Utilisant $this lorsqu'il n'est pas dans le contexte de l'objet
- Avis: Tableau de conversion de chaîne de caractères
- Avis: Essayer d'obtenir la propriété de non-erreur de l'objet
- Notice: Undefined variable ou une propriété
- Notice: Undefined Index
- Notice: Undefined offset XXX [Référence]
- Notice: Uninitialized string offset: XXX
- Remarque: l'Utilisation de undefined constant XXX - supposé 'XXX'
- MySQL: Vous avez une erreur dans votre syntaxe SQL; consultez le manuel qui correspond à votre versions du serveur MySQL pour la bonne syntaxe à utiliser à proximité de la ... à la ligne ...
- Des Normes strictes: Non méthode statique [<class>::<>] ne doit pas être appelée de façon statique
- Avertissement: la fonction s'attend à ce paramètre X pour être de type boolean/string/integer
- Erreur HTTP 500 - erreur Interne du serveur
Aussi, voir:
Aussi, pour déplacer la discussion des commentaires, s'il vous plaît aller à ceci meta question
X-Ref: PHP Parse/les Erreurs de Syntaxe; et Comment le résoudre?; Ailleurs: Commune PHP Erreurs et Solutions
voir ce coding.smashingmagazine.com/2011/11/30/... et aussi mediawiki.org/wiki/Manual:Errors_and_symptoms
X-Ref: Fixation des Erreurs PHP (Mai 2013; par Jason McCreary)
OriginalL'auteur |
Vous devez vous connecter pour publier un commentaire.
Warning: Cannot modify header information - headers already sent
Qui se passe lorsque votre script essaie d'envoyer un en-tête HTTP pour le client, mais il l'était déjà sortie avant, ce qui a entraîné des en-têtes déjà envoyé au client.
C'est un
E_WARNING
et il ne sera pas arrêter le script.Un exemple typique serait un modèle de fichier comme ceci:
La
session_start()
fonction tentera d'envoyer des en-têtes avec le cookie de session sur le client. Mais PHP déjà envoyé des en-têtes quand il a écrit le<html>
élément pour le flux de sortie. Vous auriez à déplacer lesession_start()
vers le haut.Vous pouvez résoudre ce problème en passant par les lignes avant le code de déclenchement de l'Alerte et de vérifier où il sorties. Déplacer n'importe quel en-tête de l'envoi de code avant que le code.
On oublie souvent de sortie est de nouvelles lignes après PHP de clôture de
?>
. Il est considéré comme une norme de pratique pour omettre?>
quand c'est la dernière chose dans le fichier. De même, une autre cause fréquente de cet avertissement lors de l'ouverture<?php
a un espace vide, une ligne ou un personnage invisible devant elle, ce qui provoque le serveur web pour envoyer les en-têtes et les espaces/newline ainsi, lorsque PHP démarre l'analyse ne sera pas en mesure d'envoyer des en-tête.Si votre fichier comporte plus d'un
<?php ... ?>
bloc de code, vous ne devriez avoir aucun espace entre eux. (Note: Vous pourriez avoir plusieurs blocs si vous avez eu un code qui a été construit automatiquement)Assurez-vous également que vous n'avez pas d'Ordre d'Octet dans votre code, par exemple lors de l'encodage du script est de l'UTF-8 avec BOM.
Questions Connexes:
votre fichier a plus d'un bloc en elle..." je ne suis pas sûr de ce que cela signifie. Qu'est ce qu'un "bloc"? Serait-on dans un bloc composé de
<?php ?>
et donc "plus d'un bloc" serait<?php ?> <?php ?>
?Veuillez activer le tampon de sortie, la fonction en PHP.ini fichier de configuration, si possible.Il est utilisé pour sloving cette question.Il envoie le fichier html est enregistré dans la mémoire tampon de sortie et envoyé au client qu'après le script s'arrête, donc si deux en-têtes sont émises à différents emplacement de l'ancien en-tête sera remplacé nouvel en-tête.
OriginalL'auteur
Erreur fatale: Appel à une fonction de membre ... sur un non-objet
Arrive avec un code similaire à
xyz->method()
oùxyz
n'est pas un objet et, par conséquent, quemethod
ne peut pas être appelé.C'est une erreur fatale qui va arrêter le script (compatibilité ascendante avis: Il deviendra un catchable erreur lors du démarrage de PHP 7).
Le plus souvent c'est un signe que le code est manquant vérifie les conditions d'erreur. Valider qu'un objet est en fait un objet avant d'appeler ses méthodes.
Un typique exemple serait
Dans l'exemple ci-dessus, la requête ne peut pas être préparé et
prepare()
attribuerafalse
à$statement
. Essayez d'appeler leexecute()
méthode sera alors le résultat de l'Erreur Fatale, carfalse
est un "non-objet", car la valeur est un booléen.Comprendre pourquoi votre fonction renvoyée valeur booléenne au lieu d'un objet. Par exemple, vérifiez le
$pdo
objet de la dernière erreur qui s'est produite. Les détails sur la façon de déboguer cela dépendra de la manière dont les erreurs sont gérées pour le particulier fonction/objet/classe en question.Même si le
->prepare
est un échec, alors votre$pdo
base de données gérer objet ne pas obtenir passé dans le champ d'application actuel. Trouver où elle a obtenu défini. Puis le passer en paramètre, magasin de la propriété, ou le partager par le biais de la portée mondiale.Un autre problème peut être conditionnellement la création d'un objet et d'essayer d'appeler une méthode de l'extérieur de ce bloc conditionnel. Par exemple
Par la tentative d'exécution de la méthode à l'extérieur du bloc conditionnel, votre objet ne peut pas être défini.
Questions Connexes:
OriginalL'auteur
On ne voit rien. La page est vide et blanc.
Également connu comme le Page Blanche De la Mort ou Écran Blanc De la Mort. Cela se produit lorsque les rapports d'erreur est éteint et une erreur fatale (souvent l'erreur de syntaxe).
Si vous avez d'erreur journalisation est activée, vous trouverez le béton message d'erreur dans votre journal des erreurs. Ce sera généralement dans un fichier appelé "php_errors.journal", 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 pour activer temporairement l'affichage des erreurs. Le blanc de la page affiche alors le message d'erreur. Prendre soin parce que ces erreurs sont visibles à tout le monde de visiter le site.
Ceci peut être facilement fait par l'ajout en haut du script, le code PHP suivant:
Le code activer l'affichage des erreurs et des rapports au plus haut niveau.
Depuis le
ini_set()
est exécutée à l'exécution, il n'a pas d'effet sur l'analyse/les erreurs de syntaxe. Ces erreurs apparaissent dans le journal. Si vous souhaitez afficher dans la sortie (par ex. dans un navigateur), vous devez définir ledisplay_startup_errors
directivetrue
. Pour ce faire, soit dans lephp.ini
ou dans un.htaccess
ou par toute autre méthode qui affecte la configuration de avant runtime.Vous pouvez utiliser les mêmes méthodes pour définir la log_errors et error_log directives de choisir votre propre emplacement du fichier journal.
À la recherche dans le journal ou à l'aide de l'écran, vous obtiendrez un bien meilleur message d'erreur et la ligne de code où votre script vient de s'arrêter.
Questions connexes:
Les erreurs liées:
error_reporting(~0);
pourquoi ne pas-1
? C'est ce que~0
donne, et est beaucoup moins énigmatique.Je pense que les deux sont de la même manière cryptique.
~0
est la plus explicite de l'OMI: nier le vide d'un ensemble de bits, j'. e. activer tous drapeaux. -1 n'est pas destiné à se présenter aux «non trouvé» comme dans strpos() en C, mais comme un bitset avec tous les drapeaux, parce que -1 est binaire1111'1111'1111'1111
(32 bits).Oups,
1111'1111'1111'1111
est vraiment 16 bits, mais j'espère que vous comprenez ce que je veux dire.Il est E_ALL constante pour
error_reporting
.désolé, pas de, pour les versions avant la 5.4,
E_STRICT
n'est pas inclus dansE_ALL
. php.net/manual/en/errorfunc.constants.php et faites défiler vers le bas pourE_STRICT
.OriginalL'auteur
Notice: Undefined Index
Qui se passe 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 (démo)Les deux
spinach
et1
n'existent pas dans le tableau, ce qui provoque uneE_NOTICE
d'être déclenchée.La solution est de s'assurer de l'indice ou du décalage qui existe avant de pouvoir accéder à l'indice. Cela peut signifier que vous avez besoin de corriger un bug dans votre programme pour s'assurer que ces indices n'existent que lorsque vous le souhaitez. Ou cela peut signifier que vous avez besoin de tester si les indices existent à l'aide de
array_key_exists
ouisset
:Si vous avez un code comme:
puis
$_POST['message']
ne seront pas fixés lors de ce premier chargement de la page et vous obtiendrez l'erreur ci-dessus. Uniquement lorsque le formulaire est soumis et ce code est exécuté une seconde fois l'index de tableau existe. Généralement, vous le vérifier avec:Questions Connexes:
if(!empty($_POST['message'])){ //do stuff }
OriginalL'auteur
Warning: mysql_fetch_array() s'attend à ce paramètre 1 pour être resource, boolean donné
D'abord et avant tout:
Cela se produit lorsque vous essayez d'extraire des données à partir du résultat de
mysql_query
mais l'échec de la requête.C'est un avertissement, et de ne pas arrêter le script, mais fera de votre programme de faux.
Vous avez besoin de vérifier le résultat retourné par
mysql_query
parQuestions Connexes:
Les Erreurs Liées:
Autres
mysql*
fonctions qui s'attendent également à une ressource de résultat de MySQL en tant que paramètre produira la même erreur pour la même raison.mysql_query
n'est pas assez mauvais, en ajoutantor die
sur le dessus de c'est ajouter l'insulte à la blessure.Le problème que je rencontre est
$res = mysql_query($query)
retourne 1 si la requête est réussie si elle est considérée comme vraie. Par conséquent, lorsque le résultat le passage demysql_query
àmysql_fetch_array()
l'avis indique.Pour les SÉLECTIONNER, de les MONTRER, DÉCRIRE, EXPLIQUER et autres déclarations de retour resultset, mysql_query() retourne une ressource en cas de succès, ou FALSE en cas d'erreur. Pour les autres types d'instructions SQL INSERT, UPDATE, DELETE, DROP, etc, mysql_query() retourne TRUE en cas de succès ou FALSE en cas d'erreur.
C'est le problème, je suis confronté à, Insertion / mise à jour renvoie TRUE si je ne peux pas me débarrasser de cette erreur
mysql_fetch_array() expects parameter 1 to be resource, boolean given in select
consultez - gist.github.com/romelemperado/93af4cdbd44ebf3a07cbfa0e3fc539d7 Toute suggestion tendant à git débarrasser de cette erreur?est pour la requête select, insert et update, vous n'avez pas besoin de récupérer l'ensemble de résultats (et il n'y a pas de jeu de résultats vous laisse chercher).
OriginalL'auteur
Erreur fatale: en Utilisant $this lorsqu'il n'est pas dans le contexte de l'objet
$this
est une variable en PHP qui ne peuvent être attribués. Si elle est accessible, dans un contexte où il n'existe pas, cette erreur fatale est donné.Cette erreur peut se produire:
Si un non-statique méthode est appelée de façon statique. Exemple:
Comment résoudre: de réviser votre code de nouveau,
$this
ne peut être utilisé dans un contexte de l'objet, et ne doit jamais être utilisé dans une méthode statique. Aussi, une méthode statique ne doit pas accéder à la non-propriété statique. Utilisationself::$static_property
pour accéder à la propriété statique.Si le code d'une méthode de la classe a été copié sur une fonction normale ou tout simplement de la portée mondiale et de maintien de la
$this
variable spéciale.Comment résoudre: Revoir le code et remplacer
$this
avec une autre variable de substitution.Questions Connexes:
Je parlais d'un appel statique à l'intérieur d'une Fermeture. Comme
$closure = function() { self::method(); }
.C'est une autre erreur: "erreur Fatale: Impossible d'accéder au self:: quand aucune classe étendue est active" Cependant, avec
$this
vous pouvez déclencher la encore personnalisés "Fatal error: en Utilisant $this lorsqu'il n'est pas dans le contexte de l'objet" :$closure = function() { $this->method(); };
OriginalL'auteur
Fatal error: Call to undefined function XXX
Se produit lorsque vous essayez d'appeler une fonction qui n'est pas encore défini. Les causes courantes comprennent extensions manquantes et comprend, à condition déclaration de fonction, fonction dans une déclaration de fonction ou de simples fautes de frappe.
L'Exemple 1, À La Condition Déclaration De Fonction
Dans ce cas,
fn()
ne sera jamais déclaré, parce que$someCondition
n'est pas vrai.Exemple 2 - Fonction dans la Déclaration de Fonction
Dans ce cas,
fn
ne seront déclarées une foiscreateFn()
est appelée. À noter que les appels àcreateFn()
va déclencher une erreur sur Redeclaration d'une fonction Existante.Vous pouvez également voir ce pour une fonction PHP. Essayez de rechercher la fonction dans le manuel officiel, et vérifier ce que "l'extension" (module PHP), il appartient, et quelles sont les versions de PHP en charge.
En cas de disparition d'extension, d'installer l'extension et l'activer dans php.ini. Consultez les Instructions d'Installation dans le Manuel PHP pour l'extension de votre fonction s'affiche dans. Vous pouvez également être en mesure d'activer ou installer l'extension à l'aide de votre gestionnaire de paquets (par exemple,
apt
sous 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 son commentaire section. S'il a été supprimé à partir de PHP, rechercher des informations sur la raison pour laquelle, comme il peut ne plus être nécessaire.
En cas de manquant comprend, assurez-vous d'inclure le fichier de déclarer la fonction avant l'appel de la fonction.
En cas de fautes de frappe, de corriger la faute de frappe.
Questions Connexes:
OriginalL'auteur
Parse error: syntax error, unexpected T_XXX
Qui arrive quand vous avez
T_XXX
jeton inattendus de la place, asymétrique (superflu) entre parenthèses, l'utilisation de la balise courte sans l'activer dans php.ini, et beaucoup plus.Questions Connexes:
Pour obtenir de l'aide, voir:
OriginalL'auteur
Erreur fatale: impossible d'utiliser la fonction de valeur de retour à écrire contexte
Cela se produit généralement lors de l'utilisation d'une fonction directement avec
empty
.Exemple:
C'est parce que
vide
est une structure du langage, et non pas une fonction, il ne peut pas être appelée avec une expression comme argument dans les versions de PHP avant de 5.5. Avant PHP 5.5, l'argument deempty()
doit être un variable, mais une expression arbitraire (par exemple une valeur de retour d'une fonction) est admissible en PHP 5.5+.empty
, malgré son nom, n'a pas fait vérifier 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) sera toujours considéré qu'il existe, donc, ici,empty
est seulement de vérifier si elle est égale à false. Vous pouvez remplacerempty()
ici avec!
, par exempleif (!is_null(null))
, ou explicitement comparer à faux, par exempleif (is_null(null) == false)
.Questions Connexes:
OriginalL'auteur
MySQL: Vous avez une erreur dans votre syntaxe SQL; consultez le manuel qui correspond à votre versions du serveur MySQL pour la bonne syntaxe à utiliser à proximité de la ... à la ligne ...
Cette erreur est souvent causée parce que vous avez oublié de sortir correctement les données transmises à une requête MySQL.
Un exemple de ce que pas à faire (la "Mauvaise Idée"):
Ce code pourrait être inclus dans une page avec un formulaire pour soumettre, avec une URL de la forme http://example.com/edit.php?id=10 (pour éditer le post n°10)
Ce qui va se passer si le texte soumis contient des apostrophes?
$query
va se retrouver avec:Et lorsque cette requête est envoyée à MySQL, il va se plaindre que la syntaxe est mauvaise, car il y a un apostrophe dans le milieu.
Pour éviter de telles erreurs, vous DOIT toujours échapper les données avant de les utiliser dans une requête.
S'échapper de données avant de l'utiliser dans une requête SQL est également très important car si vous ne le faites pas, votre script sera ouvert à des 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. C'est un très grave problème de sécurité!
Documentation:
mysql_real_escape_string()
mysqli_real_escape_string()
Cliquez sur "éditer" pour modifier la réponse. Je suis conscient qu'il peut être amélioré.
Ou utiliser une requête sql.
OriginalL'auteur
Fatal error: Allowed memory size of XXX bytes exhausted (tried to allocate XXX octets)
Il n'y a pas assez de mémoire pour exécuter votre script. PHP a atteint la limite de la mémoire et s'arrête l'exécution. Cette erreur est fatale, le script s'arrête. La valeur de la limite de mémoire peut être configuré dans le
php.ini
fichier ou en utilisantini_set('memory_limit', '128 M');
dans le script (qui remplacera la valeur définie dansphp.ini
). Le but de la limite de mémoire est d'éviter qu'un seul script PHP à partir d'engloutir toute la mémoire disponible et d'amener l'ensemble du serveur web vers le bas.La première chose à faire est de minimiser la quantité de mémoire de votre script. Par exemple, si vous êtes en train de lire un gros fichier dans une variable, ou à l'extraction de nombreux enregistrements à partir d'une base de données et les stocker dans un tableau, qui peut utiliser beaucoup de mémoire. Modifiez votre code pour l'au lieu de lire le fichier ligne par ligne, ou chercher de la base de données les enregistrements un à un, sans avoir à les stocker dans la mémoire. Cela va nécessiter un peu conceptuel, la conscience de ce qui se passe derrière les coulisses, et lorsque les données sont stockées dans la mémoire vs ailleurs.
Si cette erreur s'est produite lors de votre script ne faisait pas beaucoup de mémoire de travail, vous devez vérifier votre code pour voir s'il y a une fuite de mémoire. Le
fonction memory_get_usage
fonction est votre ami.Questions Connexes:
OriginalL'auteur
Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE
Cette erreur est le plus souvent rencontrée lors de la tentative de faire référence à un tableau de la valeur avec un cité clé pour l'interpolation à l'intérieur d'une chaîne de caractères entre guillemets lorsque la totalité de la variable complexe construire n'est pas enfermé dans
{}
.L'erreur de cas:
Ce résultat
Unexpected T_ENCAPSED_AND_WHITESPACE
:Des correctifs possibles:
Dans une chaîne entre guillemets, PHP va permettre clé du tableau de chaînes de caractères pour être utilisé non cotées, et n'émet pas de
E_NOTICE
. Ainsi, le ci-dessus peut être écrite comme:L'ensemble du complexe de la variable de matrice et clé(s) peut être enfermé dans
{}
, dans ce cas, ils devrait être cité pour éviter uneE_NOTICE
. La documentation PHP recommande cette syntaxe pour les variables complexes.Bien sûr, l'alternative à tout de la ci-dessus est de concaténer la variable tableau en place de l'interpolation:
Pour référence, voir la section sur les Variable d'Analyse dans les Chaînes de PHP de la page de manuel
OriginalL'auteur
Avertissement: [fonction]: failed to open stream: [raison]
Cela se produit lorsque vous appelez un fichier généralement par
include
,require
oufopen
et PHP n'arrivais pas à trouver le fichier ou n'ont pas d'autorisations suffisantes pour ouvrir le fichier.Cela peut se produire pour une variété de raisons :
Une erreur courante est de ne pas utiliser un chemin absolu. Ce problème peut être facilement résolu en utilisant un chemin d'accès complet ou les constantes magiques comme
__DIR__
oudirname(__FILE__)
:ou:
Garantir le droit chemin est une étape dans la résolution de ces problèmes, cela peut aussi être liée à la non-fichiers existants, les droits du système de fichiers pour empêcher l'accès ou de l'open basedir restrictions 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:
Les Erreurs Liées:
OriginalL'auteur
Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM
L'opérateur de résolution de portée est également appelé "Paamayim Nekudotayim" à partir de l'hébreu פעמיים נקודתיים. ce qui signifie "double deux-points" ou "double point deux fois".
Cette erreur se produit généralement si vous avez, par inadvertance mis
::
dans votre code.Questions Connexes:
Documentation:
a()::b;
ou$a=::;
.Aah, la beauté de T_PAAMAYIM_NEKUDOTAYIM...
OriginalL'auteur
Fatal error: Cannot redeclare class [nom de la classe]
Fatal error: Cannot redeclare [nom de la fonction]
Cela signifie que vous êtes soit à l'aide de la même fonction/classe deux fois le nom et le besoin de renommer l'un d'entre eux, ou c'est parce que vous avez utilisé
require
ouinclude
où vous devriez être en utilisantrequire_once
ouinclude_once
.Lorsqu'une classe ou une fonction est déclarée dans PHP, il est immuable, et ne peut être déclarée avec une nouvelle valeur.
Considérons le code suivant:
class.php
index.php
Le deuxième appel à
do_stuff()
produira l'erreur ci-dessus. En changeantrequire
àrequire_once
, nous pouvons être certains que le fichier qui contient la définition deMyClass
ne sera chargée qu'une seule fois, et l'erreur sera évité.OriginalL'auteur
Avis: l'Utilisation de undefined constant XXX - supposé 'XXX'
ou, en PHP 7.2 ou version ultérieure:
Avertissement: l'Utilisation de undefined constant XXX - supposé 'XXX' (ce qui provoquera une Erreur dans une future version de PHP)
Le présent avis se produit lorsqu'un jeton est utilisé dans le code et qui semble être une constante, mais une constante de ce nom n'est pas défini.
L'une des causes les plus fréquentes de cet avis est un échec pour citer une chaîne de caractères utilisé comme un tableau associatif clé.
Par exemple:
Une autre cause fréquente est un manque
$
(en dollars) devant un nom de variable:Ou peut-être que vous avez mal orthographié certaines constante, ou le mot-clé:
Il peut aussi être un signe d'un besoin d'extension de PHP ou de la bibliothèque est manquant lorsque vous essayez d'accéder à une constante définie par la bibliothèque.
Questions Connexes:
OriginalL'auteur
Notice: Undefined variable
Se produit lorsque vous essayez d'utiliser une variable qui n'a pas été défini précédemment.
Un exemple typique serait
Si vous n'avez pas de définir
$counter
avant, le code ci-dessus va déclencher l'avis.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
Notice: Undefined property
Cette erreur signifie la même chose, mais se réfère à une propriété d'un objet. La réutilisation de l'exemple ci-dessus, le code pourrait déclencher l'erreur, parce que le
counter
propriété n'a pas été définie.Questions Connexes:
OriginalL'auteur
Avis: Uninitialized string offset:
*
Comme son nom l'indique, ce type d'erreur se produit, lorsque vous êtes le plus susceptible d'essayer de parcourir ou rechercher une valeur dans un tableau avec un non-existant.
Envisager de vous, cherchent à montrer que chaque lettre de
$string
L'exemple ci-dessus va générer (démo en ligne):
Et, dès que le script termine en écho
D
vous obtiendrez l'erreur, parce que l'intérieur de lafor()
boucle, vous avez dit que PHP pour vous montrer le de la première à la cinquième chaîne de caractères à partir de'ABCD'
Qui existe, mais étant donné que la boucle commence à compter à partir de0
et les échosD
par le temps qu'il atteigne4
, il lèvera une erreur de décalage.Erreurs Similaires:
OriginalL'auteur
Parse error: syntax error, unexpected T_VARIABLE
Scénario Possible
Je n'arrive pas à trouver où est mon code qui a mal tourné. Voici mon message d'erreur:
Ce que je suis en train
Réponse
Parse error: Un problème avec la syntaxe de votre programme, comme le fait de laisser un point-virgule off de la fin d'une instruction ou, comme c'est le cas ci-dessus, manquant de la
.
de l'opérateur. L'interprète s'arrête l'exécution de votre programme lorsqu'il rencontre une erreur d'analyse.Dans des mots simples, c'est une erreur de syntaxe, ce qui signifie qu'il ya quelque chose dans votre code arrêter d'être analysé correctement et, par conséquent, en cours d'exécution.
Ce que vous devez faire est de vérifier attentivement les lignes autour de l'endroit où l'erreur est toute simple des erreurs.
Ce message d'erreur signifie que dans la ligne x du fichier, l'interprète PHP m'attendais à voir une parenthèse ouverte, mais au lieu de cela, il a rencontré quelque chose qui s'appelle
T_VARIABLE
. QueT_VARIABLE
chose s'appelle untoken
. C'est le PHP interprète de la façon de s'exprimer de différentes fondamentaux des parties de programmes. Lorsque l'interpréteur lit dans un programme, il traduit ce que vous avez écrit dans une liste de jetons. Où que vous mettre une variable dans votre programme, il y a unT_VARIABLE
jeton dans l'interprète de la liste.Bonne lecture: la Liste de l'Analyseur Jetons
Donc, assurez-vous d'activer au moins
E_PARSE
dans votrephp.ini
. Erreurs d'analyse ne doit pas exister dans la production de scripts.J'ai toujours recommandé d'ajouter l'instruction suivante, lors de l'encodage:
Rapport d'erreurs PHP
Aussi, une bonne idée d'utiliser un IDE qui vous permettra de savoir analyser les erreurs lors de la frappe. Vous pouvez utiliser:
Questions Connexes:
OriginalL'auteur
Avertissement: open_basedir restriction in effect
Cet avertissement peut apparaître avec diverses fonctions qui sont liées aux fichiers et accès à l'annuaire. Il met en garde à propos d'un problème de configuration.
Lorsqu'il apparaît, cela signifie que l'accès a été interdit à certains fichiers.
L'avertissement lui-même ne pas casser quoi que ce soit, mais le plus souvent, un script de ne pas fonctionner correctement si le fichier d'accès est empêché.
Le correctif est normalement pour changer le La configuration de PHP, le paramètre est appelé
open_basedir
.Parfois un mauvais fichier ou répertoire de noms sont utilisés, la solution est alors d'utiliser le droit.
Questions Connexes:
OriginalL'auteur
Parse error: syntax error, unexpected '['
Cette erreur vient dans deux variatians:
Variation 1
Ce tableau initialiseur de syntaxe a été introduit en PHP 5.4; il déclenche une erreur d'analyse sur les versions d'avant. Si possible, mettez à niveau votre installation ou de l'utilisation de l'ancienne syntaxe:
Voir aussi cet exemple dans le manuel.
Variation 2
Tableau de déférence fonction des résultats a également été introduit en PHP 5.4. Si il n'est pas possible de mettre à niveau, vous devez utiliser un (temporaire) de la variable:
Voir aussi cet exemple dans le manuel.
OriginalL'auteur
Avis: Essayer d'obtenir la propriété de non-erreur d'objets
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 non-objet de l'avis serait
Dans ce cas,
$users
est un tableau (donc pas d'un objet) et il n'a pas de propriétés.Ceci est similaire à l'accès à un non-existant de l'indice ou de la clé d'un tableau (voir Notice: Undefined Index).
Cet exemple est très simplifiée. Le plus souvent un avis de signaux incontrôlées valeur de retour, par exemple, lorsqu'une bibliothèque retourne
NULL
si un objet n'existe pas ou tout simplement inattendu de la non-valeur de l'objet (par exemple dans un résultat Xpath, JSON structures inattendues format XML avec format inattendu, etc.) mais le code ne vérifie pas cette condition.Que ceux des non-objets sont souvent traitées plus loin, souvent fatale erreur qui se passe ensuite sur l'appel d'une méthode de l'objet sur un non-objet (voir: Erreur fatale: Appel à une fonction de membre ... sur un non-objet) arrêter le script.
Il peut être facilement évitée par la vérification des conditions d'erreur et/ou d'une variable correspond à une attente. Ici, un avis accompagné d'une DOMXPath exemple:
Le problème, c'est accéder à la
nodeValue
propriété (terrain) du premier élément alors qu'il n'a pas été vérifié si il existe ou pas dans le$result
collection. Au lieu de cela, il paye pour rendre le code plus explicite par l'affectation de variables pour les objets, le code fonctionne sur:Les erreurs liées:
json_decode
maintenant retourne une instance destdclass
par défaut, de sorte que l'exemple de code aurait en fait, le travail.Il ne fait (et toujours) retourne un tableau, par exemple: 3v4l.org/SUDe0 - Aussi pouvez-vous nous communiquer la référence de votre écrit que "
json_decode
maintenant retourne une instance destdclass
par défaut" ? Je ne trouve pas que dans le changelog.Selon le manuel PHP de la page sur json_decode, par défaut, le
assoc
paramètre est défini sur false. Ce paramètre définit si la fonction retourne unestdclass
au lieu d'un tableau associatif.OriginalL'auteur
Avertissement: [fonction] s'attend à ce paramètre 1 pour être resource, boolean donné
A plus de variation générale de Warning: mysql_fetch_array() s'attend à ce paramètre 1 pour être resource, boolean donné)
Ressources sont un type en PHP (comme des chaînes de caractères, des entiers ou des objets). Une ressource est un opaque blob sans intrinsèquement significative de la valeur de sa propre. Une ressource est spécifique et définie par un certain nombre de fonctions de PHP ou d'une extension. Par exemple, l'extension Mysql définit deux types de ressources:
L'extension cURL définit une autre deux types de ressources:
Quand
var_dump
ed, les valeurs ressembler à ceci:C'est tous les la plupart des ressources sont, un identifiant numérique (
(1)
) d'un certain type ((curl)
).Vous transporter ces ressources autour de et de les transmettre à des fonctions différentes pour lesquelles une telle ressource signifie quelque chose. Généralement, ces fonctions allouer certaines données en arrière-plan et une ressource est juste une référence qu'ils utilisent pour garder une trace de ces données en interne.
La "... s'attend à ce paramètre 1 pour être resource, boolean donné" erreur est généralement le résultat d'un décoché opération qui était censé créer une ressource, mais il est revenu
false
à la place. Par exemple, lefopen
function a cette description:Donc dans ce code,
$fp
sera unresource(x) of type (stream)
oufalse
:Si vous ne vérifient pas si le
fopen
opération a réussi ou échoué et, donc, si$fp
est une ressource valide oufalse
et passer$fp
à une autre fonction qui attend une ressource, vous pouvez obtenir l'erreur ci-dessus:Vous toujours besoin de l'erreur, vérifiez la valeur de retour de fonctions qui tentent d'allouer une ressource et peut ne pas:
Les Erreurs Liées:
OriginalL'auteur
Warning: Illegal string offset 'XXX'
Ce qui se passe lorsque vous essayez d'accéder à un élément de tableau avec le crochet de la syntaxe, mais vous êtes en train de faire cela sur une chaîne, et non pas sur un tableau, de sorte que le fonctionnement clairement ne fait pas de sens.
Exemple:
Si vous pensez que la variable doit être un tableau, voir d'où il vient et à résoudre le problème.
OriginalL'auteur
Code ne fonctionne pas/ce qui ressemble à des parties de mon code PHP sont de sortie
Si vous ne voyez pas de résultats à partir de votre code PHP que ce soit, et/ou que vous voyez des pièces de votre littéral le code source PHP de sortie dans la page web, vous pouvez être sûr que PHP n'est pas réellement exécutées. Si vous utilisez l'Affichage de la Source dans votre navigateur, vous êtes probablement de voir l'ensemble du code source PHP de fichiers que est. Depuis le code PHP est incorporée dans
<?php ?>
balises, le navigateur va essayer d'interpréter ces HTML balises et le résultat peut paraître un peu confus.Pour exécuter vos scripts PHP, vous avez besoin de:
* si vous reconfigurez, tout peut être configuré.
Ce dernier est particulièrement important. Il suffit de double cliquer sur le fichier sera probablement ouvert dans votre navigateur à l'aide d'une adresse du type:
C'est complètement sans passer par un serveur web que vous avez en cours d'exécution et que le fichier n'est pas interprété. Vous devez vous rendre à l'adresse URL du fichier sur votre serveur web, probablement quelque chose comme:
Vous pouvez également vérifier si vous êtes à l'aide de courts balises ouvertes
<?
au lieu de<?php
et votre configuration de PHP a tourné court balises ouvertes off.Voir aussi Le code PHP n'est pas exécuté, au lieu de code s'affiche sur la page
OriginalL'auteur
Warning: mysql_connect(): Accès refusé pour l'utilisateur 'nom'@'host'
Cet avertissement s'affiche lorsque vous vous connectez à une base de données MySQL/MariaDB serveur non valide ou manquant d'informations d'identification (nom d'utilisateur/mot de passe). C'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", "utilisateur", "pw")
pour des exemples.Vérifier que vous avez réellement utilisé un
$username
et$password
.(using password: NO)
.Seulement le local serveur de test permet généralement de se connecter avec le nom d'utilisateur
root
, pas de mot de passe, et letest
nom de base de données.Vous pouvez tester si ils sont vraiment correct à l'aide de la ligne de commande client:
mysql --user="username" --password="password" testdb
Nom d'utilisateur et mot de passe sont sensible à la casse et espace est pas ignoré. Si votre mot de passe contient les méta-caractères comme
$
, leur échapper, ou de mettre le mot de passe dans les guillemets simples.La plupart des fournisseurs d'hébergement mutualisé predeclare mysql comptes en relation avec le compte utilisateur unix (parfois juste préfixes ou extra numérique suffixes). Consultez la documentation d'un modèle ou de la documentation, et CPanel ou quelle que soit l'interface pour la configuration d'un mot de passe.
Voir le manuel MySQL sur Ajout de comptes d'utilisateur à l'aide de la ligne de commande. Lorsqu'il est connecté en utilisateur admin vous pouvez émettre une requête comme:
CREATE USER 'username'@'localhost' IDENTIFIED BY 'newpassword';
Ou de l'utilisation Adminer ou WorkBench ou tout autre outil graphique pour créer, vérifier ou de corriger les détails du compte.
Si vous ne pouvez pas corriger vos informations d'identification, puis en demandant l'internet "s'il vous plaît aider" n'aura aucun effet. Seuls vous et votre fournisseur d'hébergement ont des autorisations et de l'accès suffisants pour diagnostiquer et corriger les choses.
Vérifiez que vous pourrait atteindre le serveur de base de données, en utilisant le nom d'hôte fourni par votre fournisseur de:
ping dbserver.hoster.example.net
Vérifier ce à partir d'une console SSH directement sur votre serveur. Test de votre local de développement client à votre serveur d'hébergement mutualisé est rarement significatif.
Souvent vous voulez juste le nom du serveur pour être
"localhost"
, à qui l'on utilise normalement un local nommé socket lorsqu'ils sont disponibles. Othertimes vous pouvez essayer"127.0.0.1"
comme solution de repli.Devrait MySQL/MariaDB serveur écoute sur un autre port, puis utilisez
"servername:3306"
.Si cela échoue, alors il y a peut-être un problème de firewall. (Hors-sujet, pas une question de programmation. À distance de deviner-aide possible.)
Lors de l'utilisation de constantes comme par exemple
DB_USER
ouDB_PASSWORD
, vérifiez qu'ils sont en fait défini.Si vous obtenez une
"Warning: Access defined for 'DB_USER'@'host'"
et un"Notice: use of undefined constant 'DB_PASS'"
, alors c'est votre problème.Vérifier que votre ex
xy/db-config.php
était inclus et whatelse.Case pour définir correctement
BOURSE
autorisations.Il ne suffit pas d'avoir un
username
+password
paire.Chaque MySQL/MariaDB compte peut avoir un attaché de permissions.
Ceux qui peuvent restreindre les bases de données sont autorisés à se connecter, à partir de laquelle client/serveur, la connexion peut provenir d', et les requêtes sont autorisées.
"Accès refusé" avertissement ainsi peut ainsi montrer pour
mysql_query
des appels, si vous ne disposez pas des autorisationsSELECT
à partir d'une table spécifique, ouINSERT
/UPDATE
, et plus généralementDELETE
quoi que ce soit.Vous pouvez adapter les autorisations de compte lorsqu'il est connecté par client en ligne de commande à l'aide de la compte admin avec une requête comme:
GRANT ALL ON yourdb.* TO 'username'@'localhost';
Si l'avertissement s'affiche avec
Warning: mysql_query(): Access denied for user ''@'localhost'
, alors vous pourriez avoir un php.ini-préconfigurés compte/mot de passe.Vérifier que
mysql.default_user=
etmysql.default_password=
ont des valeurs significatives.Souvent, ce est un fournisseur de configuration. Afin de contacter leur support pour les inadéquations.
Trouver la documentation de votre fournisseur d'hébergement mutualisé:
par exemple HostGator, GoDaddy, 1and1, DigitalOcean, BlueHost, DreamHost, MediaTemple, ixWebhosting, lunarhosting, ou tout simplement google vôtre.
D'autre de consulter votre fournisseur d'hébergement web par le biais de leurs canaux de soutien.
Notez que vous pouvez aussi avoir appauvri la connexion disponible piscine. Vous aurez accès refusé avertissements pour de trop nombreuses connexions simultanées. (Vous devez vérifier la configuration. C'est un hors-sujet de configuration du serveur de question, pas une question de programmation.)
Votre libmysql client version peut ne pas être compatible avec le serveur de base de données. Normalement, MySQL et MariaDB serveurs peut être atteint avec PHPs compilé dans le pilote. Si vous avez un programme d'installation personnalisé, ou une ancienne version de PHP, et une beaucoup plus récente serveur de base de données, ou de manière significative obsolète -, puis l'incompatibilité de version peut empêcher les connexions. (Non, vous devez faire vous-même. Personne ne peut deviner à votre configuration).
Plus de références:
Ha, totalement oublié! (Probablement la dernière, utilisé qu'avec PHP3 ou alors..)
OriginalL'auteur
Avis: Tableau de conversion de chaîne de caractères
Il suffit de se produit si vous essayez de traiter un tableau en une chaîne de caractères:
Un tableau ne peut pas être simplement
echo
'd ou concaténé avec une chaîne, car le résultat n'est pas bien défini. PHP va utiliser la chaîne de caractères "Tableau" à la place de la matrice, et de déclencher l'avis de souligner 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 ceci à la place:Ou d'une boucle de la matrice:
Si cet avis apparaît quelque part, vous ne vous attendez pas, cela signifie une variable à laquelle vous avez pensé est une chaîne de caractères est en fait un tableau. Cela signifie que vous avez un bug dans votre code, ce qui rend cette variable d'un tableau au lieu de la chaîne que vous attendez.
OriginalL'auteur
Attention: Division par zéro
Le message d'avertissement "Division par zéro" est l'une des questions les plus fréquemment posées, parmi les nouveaux développeurs PHP. Cette erreur ne sera pas provoquer une exception, par conséquent, certains développeurs sont parfois supprimer l'avertissement par l'ajout, la suppression d'erreur de l'opérateur @ avant l'expression. Par exemple:
Mais, comme avec n'importe quel avertissement, la meilleure approche serait de déterminer la cause de l'avertissement et de le résoudre. La cause de l'avertissement va venir de toute instance où vous essayez de diviser par 0, une variable est égale à 0 ou à une variable qui n'a pas été affecté (en raison NULL == 0) car le résultat sera "indéfini".
Pour corriger cet avertissement, vous devez reprendre ton expression pour vérifier que la valeur est 0, si elle est, de faire autre chose. Si la valeur est zéro, vous ne doit pas diviser, ou de modifier la valeur 1, puis diviser la division des résultats dans l'équivalent d'avoir divisé seulement par la variable supplémentaire.
Questions Connexes:
Pour cet exemple, si
$var1
n' == 0 alors vous pouvez simplement mettre en$var3
à$var2
. Même si pas le faire, l'autre n'est pas du tout nécessaire que la mission est la même dans les deux cas, et personne d'autre, et de les assigner à l'extérieur de laif
OriginalL'auteur
Des Normes strictes: Non méthode statique [<class>::<>] ne devraient pas être appelée de façon statique
Se produit lorsque vous essayez d'appeler un non-méthode statique d'une classe, comme il était statique, et vous avez également la
E_STRICT
indicateur dans votreerror_reporting()
paramètres.Exemple :
HTML::br()
ou$html::br()
Vous pouvez effectivement éviter cette erreur en n'ajoutant pas de
E_STRICT
àerror_reporting()
, par exemple,depuis PHP 5.4.0 et au-dessus,
E_STRICT
est inclus dansE_ALL
[ref]. Mais ce n'est pas adviceable. La solution est de définir votre fonction statique comme de véritablesstatic
:ou appeler la fonction conventionnelle :
Questions connexes :
OriginalL'auteur
Erreur fatale: [TraitA] et [TraitB] permet de définir la même propriété ([$x]) dans la composition de [ClassC]
Se produit lorsqu'une classe tente de
utilisation
de multiples Traits, où deux ou plusieurs de ces Traits ont défini une propriété par le même nom, et avec la propriété ayant différentes valeurs initiales.Exemple:
Problématique: Alors qu'il est possible de résoudre les conflits entre les méthodes concurrentes, il n'y a actuellement pas de syntaxe qui permettrait de résoudre un conflit entre deux concurrents propriétés. La seule solution à ce moment est d' refactoriser; c'est à dire, d'éviter un conflit entre les noms de propriété qui produit une erreur fatale.
Questions Connexes:
OriginalL'auteur