Référence - que signifie cette erreur dans PHP?

Qu'est-ce que c'est?

il s'agit d'un certain nombre de réponses sur les Avertissements, les erreurs et les notices que vous pourriez rencontrer lors de la programmation de PHP et que vous ne savez pas comment corriger. C'est aussi un Wiki communautaire, donc tout le monde est invité à participer à ajouter et maintenir cette liste.

pourquoi?

des Questions comme "Headers already sent" ou "Appeler un membre d'un non-objet" pop fréquemment, sur un Débordement de Pile. La cause profonde de ces questions est toujours la même. Ainsi, les réponses à ces questions les répètent généralement et montrent ensuite à L'OP quelle ligne changer dans son 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 le même message d'erreur peut pas lire facilement la solution parce qu'ils sont trop localisée. C'est triste, parce qu'une fois que vous avez compris la cause profonde, corriger 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ée comme une copie de ceci, s'il vous plaît trouver votre message d'erreur ci-dessous et appliquer le correctif à votre code. Les réponses contiennent généralement des liens supplémentaires pour enquêter dans le cas où il ne devrait pas être clair à partir de la seule réponse générale.

Si vous voulez contribuer, s'il vous plaît ajouter vos "favoris" erreur message, Avertissement ou notice, une par réponse, une brève description de ce que cela signifie (Même s'il ne s'agit que de mettre en évidence les termes de leur page de manuel), une solution possible ou une approche de débogage et une liste de questions et réponses existantes qui sont utiles. De plus, n'hésitez pas à améliorer les réponses existantes.

La Liste

Voir aussi

938
demandé sur hakre 2012-10-07 19:11:00
la source

30 ответов

Warning: Cannot modify header information-headers already sent

se produit lorsque votre script essaie d'envoyer un en-tête HTTP au client, mais qu'il y avait déjà une sortie, ce qui a pour résultat que des en-têtes sont déjà envoyés au client.

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

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

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

la fonction session_start() essaie d'envoyer des en-têtes avec le cookie de session au client. Mais PHP a déjà envoyé des en-têtes quand il a écrit l'élément <html> au flux de sortie. Il faudrait mettre le session_start() en haut.

vous pouvez résoudre cela en passant par les lignes avant le code déclenchant l'avertissement et vérifiez où il sort. Déplacer tout en-tête envoyant du code avant ce code.

An la sortie souvent négligée est de nouvelles lignes après la fermeture de PHP ?> . Il est considéré comme une pratique courante d'omettre ?> quand c'est la dernière chose dans le dossier. De même, une autre cause commune de cet avertissement est quand l'ouverture <?php a un espace vide, une ligne, ou un caractère invisible devant elle, ce qui fait que le serveur web envoie les en-têtes et les espaces blancs/newline ainsi quand PHP commence le parsing ne sera pas en mesure de soumettre un en-tête.

si votre fichier contient plus <?php ... ?> bloc de code, vous ne devriez avoir aucun espace entre eux. (Note: vous pourriez avoir plusieurs blocs si vous aviez du code qui a été construit automatiquement)

assurez-vous également que vous n'avez pas de marque D'ordre D'octet dans votre code, par exemple lorsque L'encodage du script est UTF-8 avec BOM.

Questions Connexes:

237
répondu Gordon 2017-05-23 14:55:00
la source

erreur Fatale: Appel d'une fonction membre ... sur un non-objet

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

il s'agit d'une erreur fatale qui stoppera le script (avis de compatibilité avancé: elle deviendra une erreur récupérable à partir de PHP 7).

le plus souvent il s'agit d'un signe que le code a des vérifications manquantes pour erreur condition. Valider qu'un objet est en fait un objet avant d'appeler ses méthodes.

A exemple type exemple serait

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

dans l'exemple ci-dessus, la requête ne peut pas être préparée et prepare() assignera false à $statement . Essayer d'appeler la méthode execute() résultera alors dans l'erreur fatale parce que false est un "non-objet" parce que la valeur est un booléen.

Figure pourquoi votre fonction renvoyée valeur booléenne au lieu d'un objet. Par exemple, cochez l'objet $pdo pour la dernière erreur qui s'est produite. Les détails sur la façon de déboguer cela dépendra de la façon dont les erreurs sont traitées pour la fonction/objet/classe particulière en question.

si même le ->prepare est en panne, alors votre $pdo base de données handle object n'a pas été passé dans le champ d'application actuel . Trouver où elle a obtenu défini. Puis passez-le comme paramètre, stockez-le comme propriété, ou partagez-le via le global scope.

un autre problème peut être la création conditionnelle d'un objet et ensuite essayer d'appeler une méthode en dehors de ce bloc conditionnel. Par exemple

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

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

Questions Connexes:

162
répondu hakre 2018-04-16 07:16:00
la source

rien n'est vu. La page est vide et blanc.

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) est survenue.

si vous avez activé la journalisation des erreurs, vous trouverez le message d'erreur concret 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. La page blanche affichera alors le message d'erreur. Faites attention car ces erreurs sont visibles pour tous ceux qui visitent le site web.

cela peut être facilement fait en ajoutant en haut du script code PHP suivant:

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

Le code activer l'affichage des erreurs et des rapports au plus haut niveau.

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

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

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

questions connexes:

erreurs connexes:

104
répondu nalply 2017-05-23 15:26:38
la source

Avis: 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'avis Undefined Index serait ( demo )

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

les deux spinach et 1 n'existent pas dans le tableau, provoquant le déclenchement d'un E_NOTICE .

la solution est de assurez-vous que l'index ou le décalage existe avant d'accéder à cet index. 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 devez tester si les index existent en utilisant array_key_exists ou isset :

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

si vous avez un code comme:

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

puis $_POST['message'] ne sera pas défini 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. Vous vérifiez généralement avec:

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

Questions Connexes:

91
répondu Gordon 2017-05-23 15:34:44
la source

Warning: mysql_fetch_array() s'attend à ce paramètre 1 pour être resource, boolean donné

avant tout:

s'il vous Plaît, n'utilisez pas mysql_* les fonctions dans le nouveau code . Ils ne sont plus maintenus et sont officiellement dépréciés . Voir la boîte rouge ? En savoir plus sur déclarations préparées à la place, et utiliser AOP ou MySQLi - cet article vous aidera à décider qui. Si vous choisissez AOP, voici un bon tutoriel .


cela se produit lorsque vous essayez de récupérer des données à partir du résultat de mysql_query mais la requête a échoué.

ceci est un avertissement et ne sera pas arrêtez le script, mais votre programme se trompera.

vous devez vérifier le résultat retourné par mysql_query par

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

Questions Connexes:

Erreurs Connexes:

autres mysql* les fonctions qui s'attendent aussi à ce qu'une ressource de résultat mysql comme paramètre produise la même erreur pour la même raison.

78
répondu xdazz 2017-05-23 15:34:44
la source

erreur Fatale: en Utilisant $this lorsqu'il n'est pas dans le contexte de l'objet

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

cette erreur peut se produire:

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

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

    how to fix: relisez votre code, $this ne peut être utilisé que dans le contexte d'un objet, et ne devrait 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 juste la portée globale et garder le $this variable spéciale.

    comment corriger: revoir le code et remplacer $this par une variable de substitution différente.

Questions Connexes:

  1. Appel non méthode statique statique: PHP Fatal error: en Utilisant $this lorsqu'il n'est pas dans le contexte de l'objet
  2. Copier le code: Fatal erreur: utiliser $this lorsqu'il n'est pas dans le contexte de l'objet
  3. Tous "en Utilisant $this lorsqu'il n'est pas dans le contexte de l'objet" Questions sur Stackoverflow
70
répondu xdazz 2017-05-23 14:47:30
la source

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 communes incluent les extensions manquantes et inclut, déclaration de fonction conditionnelle, déclaration de fonction dans la déclaration de fonction ou des typos simples.

Exemple 1 - Déclaration De Fonction Conditionnelle

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

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

exemple 2-Fonction Dans la Déclaration de fonction

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

dans ce cas, fn ne sera déclaré qu'une fois createFn() appelé. Notez que les appels subséquents à createFn() déclencheront une erreur au sujet de la Redeclaration d'une fonction existante.

vous pouvez aussi voir cela 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 prennent en charge.

dans le cas d'une extension manquante, installez cette extension et activez-la en php.ini. Reportez-vous aux instructions D'Installation dans le manuel PHP pour l'extension dans laquelle votre fonction apparaît. Vous pouvez également être en mesure d'activer ou d'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 d'autres implémentations dans le manuel ou sa section commentaires. Si elle a été retirée de PHP, cherchez des informations sur pourquoi, car cela n'est peut-être plus nécessaire.

en cas de includes manquants, assurez-vous d'inclure le fichier déclarant la fonction avant d'appeler la fonction.

dans le cas de fautes de frappe, fixer la faute de frappe.

Questions Connexes:

67
répondu Gordon 2017-05-23 15:34:44
la source

erreur D'analyse: erreur de syntaxe, inattendu T_XXX

se produit lorsque vous avez T_XXX jeton à l'endroit inattendu, entre parenthèses déséquilibrées (superflu), l'utilisation de la petite étiquette sans l'activer en php.ini, et beaucoup plus.

Questions Connexes:

pour plus d'informations, voir:

66
répondu LeleDumbo 2017-05-23 15:34:44
la source

erreur Fatale: impossible d'utiliser la fonction de valeur de retour à écrire contexte

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

exemple:

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

c'est parce que empty est une construction de langue et non une fonction, il ne peut pas être appelé avec une expression comme argument dans les versions PHP avant 5.5. Avant PHP 5.5, l'argument de empty() doit être une variable , mais une expression arbitraire (telle que la valeur de retour d'une fonction) est permise dans PHP 5.5+.

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

Questions Connexes:

62
répondu xdazz 2017-05-23 15:26:38
la source

MySQL: vous avez une erreur dans votre syntaxe SQL; vérifiez le manuel qui correspond à la version de votre serveur MySQL pour la bonne syntaxe à utiliser near ... à la ligne ...

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

un exemple de ce que 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 pour soumettre, avec une URL telle que http://example.com/edit.php?id=10 (to edit the post n°10)

que se passera-t-il si le texte soumis contient des guillemets? $query se terminera par:

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

et quand cette requête est envoyée à MySQL, il se plaindra que la syntaxe est fausse, parce qu'il y a une citation supplémentaire au milieu.

pour éviter de telles erreurs, vous doit toujours échapper aux données avant d'utiliser dans une requête.

échapper aux 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 causer 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 problème de sécurité très sérieux!

de la Documentation:

57
répondu Jocelyn 2017-05-23 15:18:24
la source

Fatal error: Allowed memory size of XXX bytes exhausted (tried to allocate XXX bytes)

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 la limite de mémoire 151980920" peut être configurée soit dans le fichier php.ini ou en utilisant ini_set('memory_limit', '128 M'); dans le script (qui écrasera la valeur définie dans php.ini ). Le but de l' la limite de mémoire est d'empêcher un seul script PHP d'engloutir toute la mémoire disponible et de faire tomber tout le serveur web.

La première chose à faire est de minimiser la quantité de mémoire de votre script. Par exemple, si vous lisez un grand fichier dans une variable ou si vous récupérez de nombreux enregistrements d'une base de données et les stockez tous dans un tableau, cela peut utiliser beaucoup de mémoire. Changez votre code à la place Lire la ligne de dossier par la ligne ou fetch des enregistrements de base de données un à un le temps sans les stocker tous en mémoire. Cela exige une certaine conscience conceptuelle de ce qui se passe dans les coulisses et du moment où les données sont stockées dans la mémoire par opposition à ailleurs.

si cette erreur s'est produite alors que votre script ne faisait pas de travail intensif en mémoire, vous devez vérifier votre code pour voir s'il y a une fuite de mémoire. La fonction memory_get_usage est votre amie.

Questions Connexes:

49
répondu xdazz 2017-05-23 15:34:44
la source

erreur D'analyse: erreur de syntaxe, inattendu T_ENCAPSED_AND_WHITESPACE

cette erreur se produit le plus souvent lorsque l'on tente de faire référence à une valeur de tableau avec une touche de citation pour l'interpolation à l'intérieur d'une chaîne de caractères double citation, lorsque la construction complexe de la variable n'est pas incluse dans {} .

L'erreur de cas:

il en résultera 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 de caractères à double citation, PHP permettra l'utilisation de chaînes de touches de tableau sans citation , et ne délivrera pas de E_NOTICE . Ainsi, 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]";
//------------------------------------------------------------------------^^^^^

l'ensemble des variables et des clés du tableau complexe peut être inclus dans {} , auquel cas ils devraient être cités 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 à n'importe quel de ce qui précède est de concaténer la variable array 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 Variable d'Analyse dans les Chaînes de PHP la page de manuel de

45
répondu Michael Berkowski 2012-12-18 19:10:22
la source

erreur D'analyse: erreur de syntaxe, inattendu T_PAAMAYIM_NEKUDOTAYIM

l'opérateur de résolution de portée est aussi appelé "Paamayim Nekudotayim" de la part de l'Hébreu. ce qui signifie "double côlon" ou "double point deux fois".

cette erreur se produit typiquement si vous mettez par inadvertance :: dans votre code.

Questions Connexes:

de la Documentation:

39
répondu Rich Bradshaw 2017-05-23 14:55:00
la source

Fatal error: Cannot redeclare class [nom de classe]

Fatal error: Cannot redeclare [nom de fonction]

cela signifie que vous utilisez deux fois le même nom de fonction/classe et que vous avez besoin de renommer l'un d'eux, ou c'est parce que vous avez utilisé require ou include où vous devriez utiliser require_once ou include_once .

Lorsqu'une classe ou une fonction est déclaré en PHP, il est immuable, et ne peut être déclarée avec une nouvelle valeur.

considérons le code suivant:

de la classe.php

<?php

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

de l'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 changeant require en require_once , nous pouvons être certains que le fichier qui contient définition de MyClass ne sera chargée qu'une seule fois, et l'erreur sera évité.

37
répondu DaveRandom 2014-05-15 15:55:33
la source

Avertissement: [fonction] : failed to open stream: [raison]

cela arrive quand vous appelez un fichier habituellement par include , require ou fopen et PHP ne pouvait pas trouver le fichier ou n'avait pas assez de permission pour charger le fichier.

Cela peut se produire pour une variété de raisons :

  • chemin d'accès au fichier, c'est mal
  • chemin du fichier est relatif 1519190920"
  • inclure le chemin d'accès est incorrect
  • les autorisations sont trop restrictives
  • SELinux est en vigueur
  • et bien d'autres ...

, Une erreur courante est de ne pas utiliser un chemin absolu. Cela peut être facilement résolu en utilisant un chemin complet ou 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 une étape dans le dépannage de ces problèmes, cela peut également être lié à des fichiers non-existants, des droits du système de fichiers empêchant L'accès ou des restrictions open basedir par PHP lui-même.

la meilleure façon de résoudre ce problème rapidement est de suivre la liste de vérification de dépannage ci-dessous.

Questions Connexes:

Erreurs Connexes:

37
répondu Mahdi 2017-05-23 15:02:50
la source

avis: variable non définie

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

un exemple typique serait

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

si vous n'avez pas défini $counter avant, le code ci-dessus déclenchera 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

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

Related Questions:

36
répondu aleation 2017-05-23 15:02:50
la source

Notice: Utilisation de la constante non définie XXX-assumed 'XXX'

ou, en PHP 7.2 ou plus tard:

Avertissement: l'Utilisation de undefined constant XXX - supposé 'XXX' (ce qui provoquera une Erreur dans une future version de PHP)

cette notice se produit lorsqu'un token est utilisé dans le code et apparaît comme une constante, mais une constante de ce nom n'est pas définie.

l'Une des causes les plus fréquentes de cet avis est le défaut de cite une chaîne utilisée comme clé de tableau associatif.

par exemple:

// Wrong
echo $array[key];

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

une autre cause courante est un signe manquant $ (dollar) 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 aussi être un signe qu'une extension ou une bibliothèque PHP nécessaire est manquante lorsque vous essayez d'accéder à une constante définie par cela bibliothèque.

Questions Connexes:

35
répondu DaveRandom 2018-01-30 12:39:41
la source

Warning: open_basedir restriction in effect""

cet avertissement peut apparaître avec diverses fonctions qui sont 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 a été interdit à certains fichiers.

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

Le correctif est normalement de changer le configuration PHP , le réglage correspondant est appelé open_basedir .

parfois le mauvais nom de fichier ou de répertoire est utilisé, le correctif est alors d'utiliser les bons.

Questions Connexes:

28
répondu hakre 2017-05-23 14:55:00
la source

avis: offset chaîne non initialisée: *

comme le nom l'indique, un tel type d'erreur se produit, lorsque vous êtes le plus susceptible d'essayer d'itérer, ou de trouver une valeur à partir d'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 fini de faire écho à D vous obtiendrez l'erreur, car à l'intérieur de la boucle for() , vous avez dit à PHP de vous montrer le caractère de la première à la cinquième chaîne de 'ABCD' qui, existe , mais puisque la boucle commence à compter de 0 et fait écho à" 15194092020 "au moment où il atteint à 4 , il lancera une erreur de décalage.

Erreurs Similaires:

28
répondu samayo 2017-05-23 15:02:50
la source

erreur D'analyse: erreur de syntaxe, inattendu T_VARIABLE

scénario Possible

Je n'arrive pas à trouver où mon code a mal tourné. Voici ma pleine erreur:

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

Ce que je suis en train d'essayer

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

réponse

Parse error: un problème avec la syntaxe de votre programme, tel que laisser un point-virgule hors de la fin d'une instruction ou, comme le cas ci-dessus, manquer l'opérateur . . L'interprète s'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 interprété correctement et donc d'être exécuté.

ce que vous devez faire est vérifié soigneusement aux lignes autour desquelles l'erreur est pour les erreurs simples.

ce message d'erreur signifie que dans la ligne x du fichier, L'interpréteur PHP s'attendait à voir une parenthèse ouverte mais au lieu de cela, il a rencontré quelque chose appelé T_VARIABLE . Ce T_VARIABLE s'appelle un token . C'est la façon dont l'interprète PHP exprime les différentes parties fondamentales des programmes. Quand 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 token T_VARIABLE dans la liste de l'interpréteur.

Bonne lecture: la Liste de l'Analyseur Jetons

Donc, assurez-vous d'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 la déclaration suivante, alors que codage:

error_reporting(E_ALL);

rapport d'erreurs PHP

également une bonne idée d'utiliser un IDE qui vous fera connaître les erreurs d'analyse lors de la saisie. Vous pouvez utiliser:

  1. NetBeans (fin de la paix de la beauté, du logiciel libre) (le meilleur à mon avis)
  2. PhpStorm (oncle Gordon amour,: P, payé plan, contient des logiciel libre)
  3. Eclipse (la belle et la bête, logiciel libre)

Questions Connexes:

27
répondu NullPoiиteя 2017-05-23 14:47:30
la source

erreur D'analyse: erreur de syntaxe, inattendu ' ['

cette erreur existe en deux variantes:

Variante 1

$arr = [1, 2, 3];

cette syntaxe d'initialiseur de tableau n'a été introduite que dans PHP 5.4; elle soulèvera une erreur d'analyseur sur les versions antérieures. Si possible, mettez à jour votre installation ou utilisez l'ancienne syntaxe:

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

Voir aussi cet exemple du manuel.

Variante 2

$suffix = explode(',', 'foo,bar')[1];
Les résultats de la fonction de déréférencement du tableau

ont également été introduits dans PHP 5.4. S'il n'est pas possible de mettre à jour, vous devez utiliser une variable (temporaire):

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

Voir aussi cet exemple du manuel.

25
répondu Ja͢ck 2014-10-26 13:49:31
la source

Avis: Essayer d'obtenir la propriété de non-erreur de l'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 d'avis Sans 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 d'un objet) et il n'a pas de propriétés.

c'est similaire à l'accès à un index inexistant ou à une clé d'un tableau (voir Notice: Undefined Index ).

cet exemple est très simplifié. Le plus souvent, un tel avis signale une valeur de retour non contrôlée, par exemple quand 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, structures JSON avec format inattendu, XML avec format inattendu, etc.) mais le code ne vérifie pas cette condition.

comme ces non-objets sont souvent traitée plus loin, souvent une erreur fatale se produit ensuite en appelant une méthode objet sur un non-objet (voir: erreur fatale: appel à une fonction membre ... sur un non-objet ) arrêter le script.

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 DOMXPath exemple:

$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 au nodeValue propriété (champ) du premier article alors qu'il n'a pas été vérifié s'il existe ou non dans la collection $result . Au lieu de cela, il paie pour rendre le code plus explicite en assignant des variables aux objets sur lesquels le code opère:

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

erreurs connexes:

23
répondu hakre 2017-05-23 15:34:44
la source

Avertissement: [fonction] s'attend à ce paramètre 1 pour être resource, boolean donné

(une variation plus générale de avertissement: mysql_fetch_array () s'attend à ce que le paramètre 1 soit une ressource, booléen donné )

ressources sont un type en PHP (comme des chaînes, des entiers ou des objets). Une ressource est une tache opaque qui n'a pas de valeur intrinsèque. 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 :

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

l'extension cURL définit un autre deux types de ressources :

... une poignée bouclée et une poignée multi bouclée.

quand var_dump ed, 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 identificateur numérique ( (1) ) d'un certain type ( (curl) ).

vous portez ces ressources autour et les passer à 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.


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

Valeurs De Retour

renvoie un pointeur de fichier sur la réussite, ou FALSE sur l'erreur.

donc dans ce code, $fp sera soit un resource(x) of type (stream) ou false :

$fp = fopen(...);

si vous ne Vérifiez pas si l'opération fopen a réussi ou échoué et donc si $fp est valide ressource ou false et passer $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 tentent d'allouer une ressource et peuvent échouer :

$fp = fopen(...);

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

$data = fread($fp, 1024);

Erreurs Connexes:

22
répondu deceze 2017-05-23 15:26:38
la source

Warning: Illegal string offset 'XXX'

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

exemple:

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

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

18
répondu Karoly Horvath 2014-12-28 19:46:13
la source

le Code ne s'exécute 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 que vous voyez des parties de votre code source littéral PHP dans la page Web, vous pouvez être assez sûr que votre PHP n'est pas réellement exécuté. Si vous utilisez View Source dans votre navigateur, vous voyez probablement tout le fichier de code source PHP tel quel. Puisque le code PHP est intégré dans les balises <?php ?> , le navigateur va essayer d'interpréter ceux en tant que balises HTML et le résultat peut sembler quelque peu confus.

pour exécuter réellement vos scripts PHP, vous avez besoin de:

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

* a moins que vous ne le reconfiguriez, tout peut être configuré.

ce dernier point est particulièrement important. Il suffit de double-cliquer le fichier va probablement l'ouvrir dans votre navigateur en utilisant une adresse telle que:

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

c'est complètement court-circuiter n'importe quel 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:

http://localhost/my/file.php

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

Voir aussi le code PHP n'est pas exécuté, à la place le code affiche sur la page

17
répondu deceze 2017-05-23 14:47:30
la source

avertissement: mysql_connect (): Accès refusé pour l'utilisateur'nom' @ 'hôte'

cet avertissement apparaît lorsque vous vous connectez à un serveur MySQL/MariaDB avec des informations d'identification invalides ou manquantes (nom d'utilisateur/mot de passe). Donc c'est typiquement 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 réellement utilisé un $username et $password .

    • il est rare que vous obteniez l'accès sans mot de passe - ce qui est arrivé quand L'avertissement: dit (using password: NO) .
    • seul le serveur d'essai local permet habituellement de se connecter avec le nom d'utilisateur root , pas de mot de passe, et le nom de base de données test .

    • vous pouvez tester si ils sont really correct en utilisant le client en ligne de commande:

      mysql --user="username" --password="password" testdb

    • nom d'Utilisateur et mot de passe sont sensible à la casse et l'espace est pas ignoré. Si votre mot de passe contient des méta-caractères comme $ , échappez-les, ou mettez le mot de passe dans "single quotes .

    • la plupart des fournisseurs d'hébergement mutualisé 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 docs pour un modèle ou de la documentation, et CPanel ou n'importe quelle interface pour définir un mot de passe.

    • voir le manuel MySQL sur ajouter des comptes d'utilisateur en utilisant la ligne de commande. Lorsque connecté en tant que administrateur utilisateur vous pouvez émettre une requête comme:

      CREATE USER 'username'@'localhost' IDENTIFIED BY 'newpassword';

    • Ou utiliser 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 justificatifs d'identité, alors demander à l'internet de "s'il vous plaît aider" n'aura aucun effet. Seuls vous et votre hébergeur avez les permissions et l'accès suffisant pour diagnostiquer et arranger les choses.

  • vérifiez que vous pourriez 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 ceci depuis une console SSH directement sur votre serveur web. Tester depuis votre client de développement local vers votre serveur d'hébergement partagé est rarement significatif.

    • souvent , vous voulez juste que le nom du serveur soit "localhost" , qui utilise normalement une socket nommée locale quand disponible. D'autres fois, vous pouvez essayer "127.0.0.1" comme repli.

    • si votre serveur MySQL/MariaDB écoute sur un autre port, utilisez "servername:3306" .

    • si cela échoue, alors il y a peut-être un problème de pare-feu. (Hors-sujet, pas une question de programmation. Aucun possibilité de deviner à distance.)

  • lorsque vous utilisez constantes comme par exemple DB_USER ou DB_PASSWORD , Vérifiez qu'elles sont effectivement définies .

    • Si vous obtenez un "Warning: Access defined for 'DB_USER'@'host'" et un "Notice: use of undefined constant 'DB_PASS'" , alors c'est votre problème.

    • vérifiez que votre e.g. xy/db-config.php a été effectivement inclus et whatelse.

  • vérifier s'il est correctement réglé GRANT permissions .

    • il n'est pas suffisant d'avoir une paire username + password .

    • chaque compte MySQL/MariaDB peut avoir un ensemble de permissions.

    • ceux-ci peuvent restreindre quelles bases de données vous êtes autorisé à vous connecter, à partir de quel client/serveur la connexion peut provenir, et quelles requêtes sont autorisés.

    • l'avertissement "Accès refusé" peut donc aussi bien apparaître pour mysql_query appels, si vous n'avez pas les permissions à SELECT d'une table spécifique, ou INSERT / UPDATE , et plus généralement DELETE n'importe quoi.

    • Vous pouvez adapter les autorisations de compte quand reliées par une ligne de commande client à l'aide de la compte administrateur une requête du genre:

      GRANT ALL ON yourdb.* TO 'username'@'localhost';

  • si l'avertissement apparaît en premier avec Warning: mysql_query(): Access denied for user ''@'localhost' alors vous pouvez avoir un php.ini-préconfiguré paire compte/mot de passe .

    • vérifier que mysql.default_user= et mysql.default_password= ont des valeurs significatives.

    • Souvent, ce est un fournisseur de configuration. Alors contactez leur support pour les asymétries.

  • trouvez la documentation de votre hébergeur partagé:

  • notez que vous pouvez aussi avoir épuisé le pool de connexion disponible . Vous obtiendrez des avertissements Accès refusé pour trop de connexions simultanées. (Vous devez vérifier la configuration. C'est un problème de configuration du serveur hors sujet, pas une question de programmation.)

  • votre client libmysql version peut ne pas être compatible avec le serveur de base de données. Normalement, les serveurs MySQL et MariaDB peuvent être atteints avec PHPs compilé dans driver. 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 significativement obsolète - alors l'inadéquation de la version peut empêcher les connexions. (Non, vous devez faire vous-même. Personne ne peut deviner votre installation).

plus de références:

Btw, vous ne voulez probablement pas utiliser mysql_* fonctions plus . Les nouveaux arrivants migrent souvent vers mysqli , ce qui est cependant tout aussi fastidieux. Au lieu de cela lire sur AOP et a préparé des déclarations .

$db = new PDO("mysql:host=localhost;dbname=testdb", "username", "password");

16
répondu mario 2017-05-23 15:26:38
la source

avis: conversion tableau en chaîne de caractères

cela se produit tout simplement si vous essayez de traiter un tableau comme une chaîne de caractères:

$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, parce que le résultat n'est pas bien défini. PHP utilisera la chaîne de caractères "Array" à la place du tableau, et déclenchera la notification pour 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:

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

Ou en 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 fait un tableau. Cela signifie que vous avez un bug dans votre code qui fait de cette variable un tableau au lieu de la chaîne que vous attendez.

14
répondu deceze 2018-04-05 18:29:47
la source

avertissement: Division par zéro

le message d'avertissement 'Division by zero' est l'une des questions les plus fréquemment posées par les nouveaux développeurs PHP. Cette erreur ne causera pas d'exception, par conséquent, certains développeurs supprimeront occasionnellement l'avertissement en ajoutant l'opérateur de suppression d'erreur @ avant l'expression. Par exemple:

$value = @(2 / 0);

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 n'importe quelle instance où vous tentez de diviser par 0, une variable égale à 0, ou une variable qui n'a pas été assignée (parce que NULL == 0) parce que le résultat sera 'undefined'.

pour corriger cet avertissement, vous devriez réécrire votre expression pour vérifier que la valeur n'est pas 0, si elle est, faire autre chose. Si la valeur est zéro, vous ne devriez pas diviser, ou changer la valeur à 1 et puis diviser de sorte que la division résulte en l'équivalent d'avoir divisé seulement 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
répondu davidcondrey 2017-05-23 15:10:44
la source

des Normes Strictes: Non méthode statique [::] ne devraient pas être appelée de façon statique

se produit lorsque vous essayez d'appeler une méthode non-statique sur une classe comme il était statique, et vous avez également le drapeau E_STRICT dans vos paramètres error_reporting() .

exemple:

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

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

, Vous pouvez effectivement éviter cette erreur en ne ajouter E_STRICT à error_reporting() , par exemple

error_reporting(E_ALL & ~E_STRICT);

puisque comme pour PHP 5.4.0 et plus, E_STRICT est inclus dans E_ALL [ ref ]. Mais ce n'est pas adviceable. La solution est de définir votre fonction statique prévue comme réelle static :

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

ou appeler la fonction conventionnellement:

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

questions connexes:

8
répondu davidkonrad 2017-05-23 15:10:44
la source

Fatal error: [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 use Traits multiples , lorsque deux ou plusieurs de ces Traits ont défini une propriété par le même nom, et avec la propriété ayant 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 qui permettrait de résoudre un conflit entre deux propriétés concurrentes. La seule solution pour le moment est de refactor , c'est-à-dire d'éviter un conflit entre les noms de propriété qui produit une erreur fatale.


Questions Connexes:

2
répondu jaswrks 2017-11-07 17:27:54
la source

Autres questions sur php mysql debugging warnings