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


1138

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

Regarde aussi:


7
Aussi, pour déplacer la discussion hors des commentaires, veuillez aller à cette méta-question
Earlz



Réponses:


275

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_WARNINGet cela n'arrêtera pas le script.

Un exemple typique serait un fichier modèle comme celui-ci:

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

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éplacer session_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 <?phpa 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:


2
Si vous utilisez WordPress, vérifiez les fichiers de thème. Lorsque j'ai mis à niveau un site vers une nouvelle version de WordPress, je n'ai pas pu mettre à jour le thème car il n'a pas été mis à jour depuis plusieurs années. Ce problème est apparu. Il s'est avéré que le fichier functions.php avait plus d'un <? ?> bloc avec des espaces entre les deux.
Roy Leban

2
@RoyLeban "Si votre fichier contient plus d'un bloc ..." Je ne sais pas ce que cela signifie. Qu'est-ce qu'un "bloc"? Un bloc serait-il composé <?php ?>et donc "plus d'un bloc" le serait <?php ?> <?php ?>?
Andrew Fox

2
Veuillez activer la fonction de 'tampon de sortie' dans le fichier de configuration PHP.ini si possible.Il est utilisé pour résoudre ce problème.Il envoie le fichier html est enregistré dans le tampon de sortie et envoyé au client uniquement après l'arrêt du script, donc si deux les en-têtes sont émis à un emplacement différent, puis l'ancien en-tête sera remplacé par le nouvel en-tête.
Nidhin David

191

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

Se produit avec un code similaire à xyz->method()xyzn'est pas un objet et qui methodne 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

// ... 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()sera affectée falseà $statement. Essayer d'appeler la execute()méthode entraînera alors l'erreur fatale car il falses'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' $pdoobjet 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 $pdoobjet 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

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

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

Questions connexes:


115

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/apache2sur 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:

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

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 la display_startup_errorsdirective sur true. Pour ce faire, dans php.iniou dans une .htaccessou 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:


3
error_reporting(~0);pourquoi pas -1? C'est ce qui est ~0évalué et est beaucoup moins cryptique.
Fabrício Matté

3
Je pense que les deux sont également cryptiques. ~0est 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 binaire 1111'1111'1111'1111(pour 32 bits).
nalply

2
Oups, 1111'1111'1111'1111c'est vraiment 16 bits, mais j'espère que vous comprenez ce que je veux dire.
nalply

3
@IvanSolntsev, désolé non, pour les versions antérieures à 5.4, E_STRICTn'est pas inclus dans E_ALL. php.net/manual/en/errorfunc.constants.php et faites défiler jusqu'à E_STRICT.
nalply

102

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 Indexavis serait ( démo )

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

Les deux spinachet 1n'existent pas dans le tableau, provoquant E_NOTICEle 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_existsou isset:

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

Si vous avez du code comme:

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

alors $_POST['message']ne sera pas défini lors du premier chargement de cette page et vous obtiendrez l'erreur ci-dessus. Ce n'est que lorsque le formulaire est soumis et que ce code est exécuté une deuxième fois que l'index du tableau existe. Vous vérifiez généralement cela avec:

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

Questions connexes:


J'ai tendance à utiliserif(!empty($_POST['message'])){ //do stuff }
kurdtpage

85

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

Tout d'abord:

Veuillez ne pas utiliser de mysql_*fonctions dans le nouveau code . Ils ne sont plus entretenus et sont officiellement obsolètes . Vous voyez la boîte rouge ? Découvrezplutôt les instructions préparées et utilisez PDO ou MySQLi - cet article vous aidera à décider lesquelles. Si vous choisissez PDO, voici un bon tutoriel .


Cela se produit lorsque vous essayez d'extraire des données du résultat de mysql_querymais 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_querypar

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

Questions 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.


5
Juste une note. Si ce mysql_queryn'est pas assez mauvais, l'ajouter or dieau-dessus ajoute de l'insulte à la blessure.
Madara's Ghost

Le problème que je rencontre est de $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 de mysql_query à mysql_fetch_array() des spectacles de préavis.
mboy

@mboy Pour SELECT, SHOW, DESCRIBE, EXPLAIN et d'autres instructions renvoyant un ensemble de résultats, mysql_query () renvoie 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 () renvoie TRUE en cas de succès ou FALSE en cas d'erreur.
xdazz

@xdazz C'est le problème auquel je suis confronté, la mise à jour d'insertion renvoie VRAI donc je ne peux pas me débarrasser de cette erreur, 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?
mboy

2
@mboy 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).
xdazz

79

Erreur fatale: utilisation de $ this en dehors du contexte de l'objet

$thisest 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:

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

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

    Comment résoudre ce problème: vérifiez à nouveau votre code,$thisil 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_propertypour accéder à la propriété statique.

  2. Si le code d'une méthode de classe a été copié dans une fonction normale ou simplement la portée globale et en conservant la $thisvariable spéciale.
    Résolution des problèmes: passez en revue le code et remplacez-le $thispar une autre variable de substitution.

Questions connexes:

  1. Appeler une méthode non statique comme statique: PHP Erreur fatale: utiliser $ this en dehors du contexte de l'objet
  2. Copie sur le code: erreur fatale: utilisation de $ this en dehors du contexte de l'objet
  3. Toutes les questions "Utiliser $ this quand il n'est pas dans le contexte de l'objet" sur Stackoverflow

2
Vous voudrez peut-être également mentionner comment cela fonctionne avec les fermetures (même dans les méthodes non statiques) et comment il est «corrigé» en 5.4.
Kendall Hopkins

2
@hakre Je parlais d'un appel statique à l'intérieur d'une fermeture. Comme $closure = function() { self::method(); }.
Kendall Hopkins

2
@KendallHopkins: C'est une erreur différente: "Erreur fatale: impossible d'accéder à self :: lorsqu'aucune portée de classe n'est active" Cependant, $thisvous pouvez déclencher le message d' erreur "Erreur fatale: utiliser $ this en$closure = function() { $this->method(); };
dehors du

75

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

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

Dans ce cas, fn()ne sera jamais déclaré car ce $someConditionn'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, fnne sera déclaré qu'une fois createFn()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 aptdans Debian ou Ubuntu, yumdans 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:


73

Erreur d'analyse: erreur de syntaxe, T_XXX inattendu

Cela se produit lorsque vous avez un T_XXXjeton 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:


70

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:

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

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 to empty()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 (comme is_null(null)dans l'exemple) seront toujours réputées exister, donc voici emptyseulement vérifier si elles sont égales à false. Vous pouvez remplacer empty()ici par !, par exemple if (!is_null(null)), ou comparer explicitement à faux, par exemple if (is_null(null) == false).

Questions connexes:


64

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"):

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

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

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

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

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:


3
De plus, si vous ne le faites pas, votre site sera piraté automatiquement par les bots
apscience

2
@gladoscc Cliquez sur "modifier" et modifiez la réponse. Je suis conscient que cela peut être amélioré.
Jocelyn

2
Ou utilisez une requête SQL préparée.
Matej

53

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.inifichier, soit en utilisant ini_set('memory_limit', '128 M');dans le script (qui écrasera la valeur définie dans php.ini). Le but de la limite de mémoire est d'empêcher un seul script PHP d'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_usagefonction est votre ami.

Questions connexes:


53

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:

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

Corrections possibles:

Dans une chaîne entre guillemets doubles, PHP 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:

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

L'ensemble de la variable de tableau complexe et des clés peut être inclus {}, auquel cas ils doivent ê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 à l' une des options ci-dessus consiste à concaténer la variable de tableau au lieu de l'interpoler:

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

Pour référence, consultez la section sur l' analyse des variables dans la page de manuel PHP Strings


45

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

Cela se produit lorsque vous appelez un fichier généralement par include, requireou fopenet 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:

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

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__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, 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:


44

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 façon la plus simple de déclencher cette erreur est d'exécuter a()::b;ou $a=::;.
Ismael Miguel

43

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:

// Wrong
echo $array[key];

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

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

// Wrong
echo varName;

// Right
echo $varName;

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

// Wrong
$foo = fasle;

// Right
$foo = false;

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:


2
Je dirais que la cause la plus courante est d'oublier $ devant une variable, pas des tableaux.
Overv

42

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é requireou includeoù vous devriez utiliser require_onceou include_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

<?php

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

index.php

<?php

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

do_stuff();
do_stuff();

Le deuxième appel à do_stuff()produira l'erreur ci-dessus. En changeant requirepour require_once, nous pouvons être certains que le fichier contenant la définition de MyClassne sera chargé qu'une seule fois, et l'erreur sera évitée.


3
Est-il utile de mentionner l'utilisation de l'autochargement, et des normes telles que le PSR-4 ou même le PSR-0 maintenant obsolète s'en débarrassent à peu près en vous évitant d'avoir à utiliser vous-même (sauf quelques cas bizarres).
DanielM

39

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

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

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

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

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

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 counterpropriété n'a pas été définie.

$obj = new stdclass;
$obj->property = 2342;
foreach ($items as $item) {
    // do something with item
    $obj->counter++;
}

Questions connexes:


35

Erreur d'analyse: erreur de syntaxe, T_VARIABLE inattendu

Scénario possible

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

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

Ce que j'essaye

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

Réponse

Erreur d'analyse: un problème 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. Cette T_VARIABLEchose s'appelle un token. 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 un T_VARIABLEjeton dans la liste des interprètes.

Bonne lecture: Liste des jetons de l'analyseur

Assurez-vous donc d'activer au moins E_PARSEdans 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 lors du codage:

error_reporting(E_ALL);

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:

  1. NetBeans (un beau morceau de beauté, un logiciel gratuit) (le meilleur à mon avis)
  2. PhpStorm (oncle Gordon adore ça: P, plan payant, contient des logiciels propriétaires et gratuits)
  3. Eclipse (la belle et la bête, logiciel libre)

Questions connexes:


34

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

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

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

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

Et, dès que le script finira de faire écho, Dvous obtiendrez l'erreur, car à l'intérieur de la for()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 à compter 0et fait écho Dau moment où il atteint 4, il générera une erreur de décalage.

Erreurs similaires:


32

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

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

Dans ce cas, $usersc'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 NULLsi 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 :

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

Le problème est d'accéder à la nodeValuepropriété (champ) du premier élément alors qu'il n'a pas été vérifié s'il existe ou non dans la $resultcollection. 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:

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

Erreurs liées:


1
json_decoderenvoie maintenant une instance de stdclasspar défaut, donc l'exemple de code fonctionnerait réellement.
Hugo Zink

@HugoZink: Il retourne (et a toujours renvoyé) un tableau pour cet exemple: 3v4l.org/SUDe0 - Pouvez-vous également fournir une référence pour votre écriture qui " json_decoderenvoie maintenant une instance de stdclasspar défaut" ? Je ne trouve pas cela dans le changelog.
hakre

Selon la page du manuel PHP sur json_decode , par défaut, le assocparamètre est défini sur false. Ce paramètre décide si la fonction renvoie un stdclassau lieu d'un tableau associatif.
Hugo Zink

json_decode('[{"name": "hakre"}]', true)retournera un tableau, sinon un stdclassobjet
zanderwar

29

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


1
Cela se produit le plus souvent sur un hôte partagé, les gens ne se verrouillent généralement pas des répertoires :-)
uınbɐɥs

28

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

Cette erreur se présente en deux variantes:

Variation 1

$arr = [1, 2, 3];

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:

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

Voir également cet exemple du manuel.

Variation 2

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

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

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

Voir également cet exemple du manuel.


23

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 :

Il existe deux types de ressources utilisées dans le module MySQL. Le premier est l'identifiant 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 deux autres types de ressources :

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

Lorsqu'elles sont var_dumpéditées, 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 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 falseplace. Par exemple, la fopenfonction a cette description:

Valeurs de retour

Renvoie une ressource de pointeur de fichier en cas de succès ou FALSEd'erreur.

Donc, dans ce code, $fpsera soit un resource(x) of type (stream)ou false:

$fp = fopen(...);

Si vous ne vérifiez pas si l' fopenopération a réussi ou échoué et donc s'il $fps'agit d'une ressource valide ou si vous falsepassez $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 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 liées:


22

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:

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

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


20

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:

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

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

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

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

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:

http://localhost/my/file.php

Vous pouvez également vérifier si vous utilisez <?plutôt des balises ouvertes courtes <?phpet 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


18

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 $usernameet $password.

    • Il est rare que vous ayez accès sans mot de passe - c'est ce qui s'est produit lorsque l'avertissement: a dit (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 le testnom 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_USERou DB_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 GRANTautorisations 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_queryappels, si vous n'avez pas les autorisations pour SELECTune table spécifique, ou INSERT/ UPDATE, et plus généralement DELETEn'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=et mysql.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é:

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

Btw, vous ne voulez probablement plus utiliser de mysql_*fonctions . Les nouveaux arrivants migrent souvent vers mysqli , ce qui est cependant tout aussi fastidieux. Lisez plutôt les AOP et les déclarations préparées .
$db = new PDO("mysql:host=localhost;dbname=testdb", "username", "password");


2
mysql permet la connexion automatique via les paramètres php-ini, puis le même message d'erreur est donné avec les différentes commandes préfixées, par exemple "Avertissement: mysql_query (): Accès refusé pour l'utilisateur '' @ 'localhost' (en utilisant le mot de passe: NO) dans. .. " - juste en notant.
hakre

Ha, j'ai totalement oublié ça! (Probablement utilisé pour la dernière fois avec PHP3 ou plus ..)
mario

18

Remarque: conversion de tableau en chaîne

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

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

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

Un tableau ne peut pas simplement être echo«d» ou concaténé avec une chaîne, car le résultat n'est pas bien défini. PHP utilisera la chaîne "Array" à la place du tableau, et déclenchera 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:

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

Ou bouclez 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 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.


12

Avertissement: division par zéro

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

$value = @(2 / 0);

Mais, comme pour tout avertissement, la meilleure approche serait de rechercher la cause de l'avertissement et de le résoudre. La cause de l'avertissement proviendra de toute instance 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.

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:


Mettre à 1 si c'était 0 arrêtera l'erreur mais est-ce vraiment mieux que la suppression que vous avez dit ne devrait pas être utilisée (avec laquelle je suis d'accord)? Je suggère que la plupart du temps, il est probable qu'un autre message ou une autre valeur soit renvoyé.
James

Pour cet exemple, si $var1fait == 0, vous pouvez simplement définir $var3sur $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
James

8

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_STRICTindicateur dans vos error_reporting()paramètres.

Exemple :

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

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

Vous pouvez réellement éviter cette erreur en ne ajoutant E_STRICTpas error_reporting(), par exemple

error_reporting(E_ALL & ~E_STRICT);

puisque comme pour PHP 5.4.0 et supérieur, E_STRICTest inclus dans E_ALL[ ref ]. Mais ce n'est pas conseillé. La solution consiste à définir votre fonction statique prévue comme réelle static:

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

ou appelez la fonction de façon conventionnelle:

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

Questions connexes :


7

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:

$string = 'abc';
echo $string{0};  // a

$array = [1, 2, 3];
echo $array{0};  // 1

Ceci est obsolète depuis PHP 7.4.0 et génère un avertissement:

Obsolète: la syntaxe d'accès aux décalages de tableau et de chaîne avec accolades est déconseillée

Vous devez utiliser des crochets []pour accéder aux décalages de chaîne et aux éléments de tableau:

$string = 'abc';
echo $string[0];  // a

$array = [1, 2, 3];
echo $array[0];  // 1

Le RFC de cette modification est lié à un script PHP qui tente de résoudre ce problème mécaniquement.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.