mysqli_error - php mysql query
Référence-Que signifie cette erreur en PHP? (20)
Qu'est-ce que c'est?
Ceci est un certain nombre de réponses sur les avertissements, les erreurs et les avis que vous pourriez rencontrer lors de la programmation PHP et n'ont aucune idée de comment réparer. Il s'agit également d'un wiki communautaire, de sorte que tout le monde est invité à participer à l'ajout et au maintien de cette liste.
Pourquoi est-ce?
Des questions telles que "En-têtes déjà envoyés" ou "Appeler un membre d'un non-objet" s'affichent fréquemment dans Stack Overflow. La cause première de ces questions est toujours la même. Ainsi, les réponses à ces questions les répètent généralement, puis montrent à l'OP quelle ligne changer dans son cas particulier. Ces réponses n'ajoutent aucune valeur au site car elles s'appliquent uniquement au code particulier du PO. Les autres utilisateurs ayant la même erreur ne peuvent pas facilement lire la solution car ils sont trop localisés. C'est triste, car une fois que vous avez compris la cause première, 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 devrais-je faire ici?
Si votre question a été marquée comme doublon, veuillez trouver votre message d'erreur ci-dessous et appliquer le correctif à votre code. Les réponses contiennent généralement d'autres liens pour enquêter au cas où la réponse générale ne le permettrait pas.
Si vous souhaitez contribuer, veuillez ajouter votre message d'erreur "favori", avertissement ou avis, un par réponse, une courte description de ce que cela signifie (même si ce n'est que la mise en évidence des termes sur leur page de manuel), une solution possible une liste des questions et réponses existantes qui ont de la valeur. Aussi, n'hésitez pas à améliorer les réponses existantes.
La liste
- Rien n'est vu. La page est vide et blanche. (également connu sous le nom de White Page / Screen Of Death )
- Le code ne fonctionne pas / ce qui ressemble à des parties de mon code PHP sont sorties
- Attention: Impossible de modifier les informations d'en-tête - en-têtes déjà envoyés
- Attention: mysql_fetch_array () attend que le paramètre 1 soit resource, booléen donné alias
Attention: mysql_fetch_array (): l'argument fourni n'est pas une ressource de résultat MySQL valide
Attention: mysqli_num_rows () s'attend à ce que le paramètre 1 soit mysqli_result, booléen donné (ou variantes similaires) - Attention: [function] attend que le paramètre 1 soit resource, booléen donné
- Avertissement: [fonction] : échec de l'ouverture du flux: [raison]
- Attention: restriction open_basedir en vigueur
- Attention: Division par zéro
- Attention: Chaîne illégale offset 'XXX'
- Erreur d'analyse: erreur de syntaxe inattendue
- Erreur d'analyse: erreur de syntaxe, inattendue T_XXX
- Erreur d'analyse: erreur de syntaxe, inattendue T_ENCAPSED_AND_WHITESPACE
- Erreur d'analyse: erreur de syntaxe inattendue T_PAAMAYIM_NEKUDOTAYIM
- Erreur d'analyse: erreur de syntaxe, inattendue 'require_once' (T_REQUIRE_ONCE), fonction expectative (T_FUNCTION)
- Erreur d'analyse: erreur de syntaxe, inattendue T_VARIABLE
- Erreur fatale: La taille de la mémoire autorisée de XXX octets est épuisée (tentative d'allocation de XXX octets)
- Erreur fatale: appel à une fonction membre ... sur un non-objet
- Erreur irrécupérable: appel à la fonction indéfinie XXX
- Erreur fatale: impossible de redéclairer XXX
- Erreur fatale: Impossible d'utiliser la valeur de retour de la fonction dans le contexte d'écriture
- Erreur fatale: La déclaration de AAA :: BBB () doit être compatible avec celle de CCC :: BBB () '
- Erreur irrécupérable: Utiliser $ this quand il n'est pas dans un contexte d'objet
- Remarque: Array à la conversion de chaîne
- Remarque: Essayer d'obtenir la propriété d'erreur non-objet
- Remarque: variable indéfinie
- Avis: Index indéfini
- Avis: Offset non défini XXX [Référence]
- Remarque: Décalage de chaîne non initialisé: XXX
- Remarque: Utilisation de la constante non définie XXX - supposée 'XXX'
- MySQL: Vous avez une erreur dans votre syntaxe SQL; consultez le manuel qui correspond à votre version du serveur MySQL pour la bonne syntaxe à utiliser près de ... à la ligne ...
- Normes strictes: la méthode non statique [<classe> :: <méthode>] ne doit pas être appelée statiquement
Regarde aussi
Attention: [function] attend que le paramètre 1 soit resource, booléen donné
(Une variation plus générale de Warning: mysql_fetch_array () s'attend à ce que le paramètre 1 soit resource, boolean donné )
Les ressources sont un type en PHP (comme les chaînes, les entiers ou les objets). Une ressource est un blob opaque sans aucune valeur intrinsèquement significative. Une ressource est spécifique et définie par un certain ensemble de fonctions ou d'extensions PHP. Par exemple, l'extension Mysql définit deux types de ressources :
Deux types de ressources sont utilisés dans le module MySQL. Le premier est l'identifiant de lien pour une connexion à une base de données, le second une ressource qui contient le résultat d'une requête.
The cURL extension defines another two resource types :
... a cURL handle and a cURL multi handle.
When var_dump
ed, the values look like this:
$resource = curl_init();
var_dump($resource);
resource(1) of type (curl)
That's all most resources are, a numeric identifier ( (1)
) of a certain type ( (curl)
).
You carry these resources around and pass them to different functions for which such a resource means something. Typically these functions allocate certain data in the background and a resource is just a reference which they use to keep track of this data internally.
The " ... expects parameter 1 to be resource, boolean given " error is typically the result of an unchecked operation that was supposed to create a resource, but returned false
instead. For instance, the fopen
function has this description:
Return Values
Returns a file pointer resource on success, or
FALSE
on error.
So in this code, $fp
will either be a resource(x) of type (stream)
or false
:
$fp = fopen(...);
If you do not check whether the fopen
operation succeed or failed and hence whether $fp
is a valid resource or false
and pass $fp
to another function which expects a resource, you may get the above error:
$fp = fopen(...);
$data = fread($fp, 1024);
Warning: fread() expects parameter 1 to be resource, boolean given
You always need to error check the return value of functions which are trying to allocate a resource and may fail :
$fp = fopen(...);
if (!$fp) {
trigger_error('Failed to allocate resource');
exit;
}
$data = fread($fp, 1024);
Related Errors:
Attention: Impossible de modifier les informations d'en-tête - en-têtes déjà envoyés
Se produit lorsque votre script tente d'envoyer un en-tête HTTP au client mais qu'il y en avait déjà eu auparavant, ce qui a entraîné l'envoi d'en-têtes au client.
C'est un E_WARNING
et ça 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()
essaiera d'envoyer les en-têtes avec le cookie de session au client. Mais PHP a déjà envoyé des en-têtes lors de l'écriture de l'élément <html>
dans le flux de sortie. Vous devez déplacer le session_start()
vers le haut.
Vous pouvez résoudre ce problème en parcourant les lignes avant que le code déclenche l'avertissement et vérifier où il sort. Déplacez n'importe quel 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 ?>
Quand c'est la dernière chose dans le fichier. De même, une autre cause commune de cet avertissement est lorsque l'ouverture <?php
a un espace vide, une ligne ou un caractère invisible avant, provoquant l'envoi par le serveur web des en-têtes et des espaces / newline lorsque PHP commence l'analyse. soumettre un en-tête
Si votre fichier contient plus d'un bloc de code <?php ... ?>
, Vous ne devriez pas avoir d'espaces entre eux. (Remarque: vous pourriez avoir plusieurs blocs si vous aviez du code construit automatiquement)
Assurez-vous également que vous n'avez pas de marque de commande Byte dans votre code, par exemple lorsque le codage du script est UTF-8 avec BOM.
Questions connexes:
- En-têtes déjà envoyés par PHP
- Tous les "en-têtes PHP" déjà envoyés "Questions sur
- Marque de commande d'octets
- Quelles fonctions PHP créent une sortie?
Attention: restriction open_basedir en vigueur
Cet avertissement peut apparaître avec diverses fonctions liées à l'accès aux fichiers et aux répertoires. Il avertit d'un problème de configuration.
Quand il apparaît, cela signifie que l'accès à certains fichiers a été interdit.
L'avertissement lui-même ne casse rien, mais le plus souvent un script ne fonctionne pas correctement si l'accès au fichier est empêché.
Le correctif consiste normalement à changer la configuration de PHP , le paramètre associé est appelé open_basedir
.
Parfois, les mauvais noms de fichier ou de répertoire sont utilisés, le correctif est alors d'utiliser les bons.
Questions connexes:
- open_basedir restriction en vigueur. Le fichier (/) ne se trouve pas dans le (s) chemin (s) autorisé (s):
- Tout PHP "Avertissement: restriction open_basedir en vigueur" Querstions sur
Avertissement: [fonction] : échec de l'ouverture du flux: [raison]
Cela arrive quand vous appelez un fichier habituellement par include
, require
ou fopen
et PHP n'a pas pu trouver le fichier ou n'a pas assez de permissions pour charger le fichier.
Cela peut arriver pour diverses raisons:
- le chemin du fichier est incorrect
- le chemin du fichier est relatif
- inclure le chemin est mauvais
- les autorisations sont trop restrictives
- SELinux est en vigueur
- et beaucoup plus ...
Une erreur courante est de ne pas utiliser un chemin absolu. Cela peut être facilement résolu en utilisant un chemin complet ou des constantes magiques comme __DIR__
ou dirname(__FILE__)
:
include __DIR__ . '/inc/globals.inc.php';
ou:
require dirname(__FILE__) . '/inc/globals.inc.php';
S'assurer que le bon chemin est utilisé est une étape dans le dépannage de ces problèmes, cela peut également être lié à des fichiers inexistants, aux droits du système de fichiers empêchant l'accès ou aux restrictions open basedir par PHP lui-même.
La meilleure façon de résoudre rapidement ce problème consiste à suivre la liste de contrôle de dépannage ci-dessous.
Questions connexes:
Erreurs liées:
Erreur d'analyse: erreur de syntaxe inattendue
Cette erreur vient en deux variatians:
Variation 1
$arr = [1, 2, 3];
Cette syntaxe d'initialisation de tableau n'a été introduite que dans PHP 5.4; cela déclenchera 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 aussi cet exemple du manuel.
Variation 2
$suffix = explode(',', 'foo,bar')[1];
Les résultats de la fonction de déréférencement de tableaux ont également été introduits dans PHP 5.4. S'il n'est pas possible de mettre à niveau, vous devez utiliser une variable (temporaire):
$parts = explode(',', 'foo,bar');
$suffix = $parts[1];
Voir aussi cet exemple du manuel.
Erreur d'analyse: erreur de syntaxe inattendue T_PAAMAYIM_NEKUDOTAYIM
L'opérateur de résolution de portée est également appelé "Paamayim Nekudotayim" de l'hébreu םיים נקודתיים. ce qui signifie "deux points" ou "double point deux fois".
Cette erreur se produit généralement si vous insérez par inadvertance ::
dans votre code.
Questions connexes:
- Référence: PHP Parse / Syntaxe Erreurs; et Comment les résoudre?
- Que signifient deux colons en PHP?
- Quelle est la différence entre :: (double deux points) et -> (flèche) en PHP?
- T_PAAMAYIM_NEKUDOTAYIM inattendu, en attente de T_NS_Separator
Documentation:
Erreur d'analyse: erreur de syntaxe, inattendue T_VARIABLE
Scénario possible
Je n'arrive pas à trouver où mon code s'est mal passé. Voici mon erreur complète:
Erreur d'analyse: erreur de syntaxe, inattendue T_VARIABLE en ligne x
Ce que j'essaie
$sql = 'SELECT * FROM dealer WHERE id="'$id.'"';
Répondre
Erreur d'analyse: Un problème avec la syntaxe de votre programme, comme laisser un point-virgule hors de la fin d'une instruction ou, comme dans le cas ci-dessus, manquer le .
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 en cours d'exécution.
Ce que vous devriez faire est de vérifier soigneusement les lignes autour de l'erreur 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 à la place, il a rencontré quelque chose appelé T_VARIABLE
. Cette chose T_VARIABLE
est appelée un token
. C'est la façon dont l'interprète PHP exprime différentes parties fondamentales des programmes. Lorsque l'interprète lit dans un programme, il traduit ce que vous avez écrit dans une liste de jetons. Où que vous T_VARIABLE
une variable dans votre programme, il y a un jeton T_VARIABLE
dans la liste de l'interpréteur.
Bonne lecture: Liste des jetons d'analyseur
Assurez-vous donc d'activer au moins E_PARSE
dans votre E_PARSE
php.ini
. Les erreurs d'analyse ne doivent pas exister dans les scripts de production.
J'ai toujours recommandé d'ajouter l'instruction suivante, en codant:
error_reporting(E_ALL);
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:
- NetBeans (belle paix de la beauté, logiciel libre) (le meilleur à mon avis)
- PhpStorm (oncle Gordon aime ceci: P, plan payé, contient des logiciels propriétaires et libres)
- Eclipse (beauté et bête, logiciel libre)
Questions connexes:
- Référence: PHP Parse / Syntaxe Erreurs; et Comment les résoudre?
Erreur d'analyse: erreur de syntaxe, inattendue T_XXX
T_XXX
lorsque vous avez T_XXX
jeton T_XXX
à 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:
- Référence: PHP Parse / Syntaxe Erreurs; et Comment les résoudre?
- Erreur d'analyse: erreur de syntaxe: '{' inattendu
- Erreur d'analyse: erreur de syntaxe, fin de fichier inattendue dans mon code PHP
- Erreur d'analyse: erreur de syntaxe, inattendu '<' in - Fix?
- Erreur d'analyse: erreur de syntaxe, "?" Inattendu
Pour plus d'aide, voir:
- http://phpcodechecker.com/ - Qui fournit des explications plus utiles sur vos problèmes de syntaxe.
Erreur fatale: Impossible de redéclarer la classe [nom de la classe]
Erreur fatale: impossible de redéclairer [nom de la fonction]
Cela signifie que vous utilisez deux fois la même fonction / nom de classe et que vous devez renommer l'un d'entre eux, ou parce que vous avez utilisé require
ou include
où vous devriez utiliser require_once
ou include_once
.
Quand une classe ou une fonction est déclarée en PHP, elle est immuable et ne peut pas être déclarée plus tard 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 require
pour require_once
, nous pouvons être certains que le fichier qui contient la définition de MyClass
ne sera chargé qu'une fois, et l'erreur sera évitée.
Erreur fatale: La taille de la mémoire autorisée de XXX octets est épuisée (tentative d'allocation de XXX octets)
Il n'y a pas assez de mémoire pour exécuter votre script. PHP a atteint la limite de mémoire et arrête de l'exécuter. Cette erreur est fatale, le script s'arrête. La valeur de la limite de mémoire peut être configurée 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 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 dont votre script a besoin. Par exemple, si vous lisez un fichier volumineux dans une variable ou que vous extrayez plusieurs enregistrements d'une base de données et que vous les stockez tous dans un tableau, cela peut nécessiter beaucoup de mémoire. Changez votre code pour lire à la place le fichier ligne par ligne ou récupérer les enregistrements de base de données un à la fois sans les stocker tous en mémoire. Cela nécessite un peu de conscience conceptuelle de ce qui se passe dans les coulisses et quand les données sont stockées dans la mémoire par rapport à d'autres.
Si cette erreur se produisait lorsque votre script n'effectuait pas de travail nécessitant beaucoup de 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 ami.
Questions connexes:
- Tous "Erreur fatale: La taille de la mémoire autorisée de XXX octets est épuisée" Questions sur
Erreur fatale: appel à une fonction membre ... sur un non-objet
Se produit avec un code similaire à xyz->method()
où xyz
n'est pas un objet et donc cette method
ne peut pas être appelée.
C'est une erreur fatale qui va stopper le script (forward notice de compatibilité: il deviendra une erreur rattrapable à partir de PHP 7).
Le plus souvent, c'est un signe que le code a des vérifications manquantes pour les conditions d'erreur. Validez qu'un objet est en fait un objet avant d'appeler ses méthodes.
Un exemple typical 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()
affectera false
à $statement
. Essayer d'appeler la méthode execute()
entraînera alors l'erreur fatale car false
est 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'objet $pdo
pour la dernière erreur survenue. Les détails sur la façon de déboguer cela dépendront de la façon dont les erreurs sont traitées pour la fonction / l'objet / la classe en question.
Si même la ->prepare
échoue, alors votre objet $pdo
base de données $pdo
n'est pas passé dans la portée actuelle . Trouvez où il a été défini. Puis passez-le en 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 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:
- Appel à une fonction membre sur un non-objet
- Liste tout PHP "Erreur fatale: Appel à une fonction membre ... sur un non-objet" Questions sur
Erreur irrécupérable: Utiliser $ this quand il n'est pas dans un contexte d'objet
$this
est une variable spéciale en PHP qui ne peut pas être assignée. S'il est accédé dans un contexte où il n'existe pas, cette erreur fatale est donnée.
Cette erreur peut se produire:
Si une méthode non statique est appelée statiquement. Exemple:
class Foo { protected $var; public function __construct($var) { $this->var = $var; } public static function bar () { // ^^^^^^ echo $this->var; // ^^^^^ } } Foo::bar();
Comment corriger: réexaminez votre code,
$this
ne peut être utilisé que dans un contexte d'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. Utilisezself::$static_property
pour accéder à la propriété statique.Si le code d'une méthode de classe a été copié dans une fonction normale ou simplement dans la portée globale et en conservant la variable spéciale
$this
.
Comment corriger: Passez en revue le code et remplacez$this
par une variable de substitution différente.
Questions connexes:
- Appelez la méthode non-statique comme statique: Erreur fatale de PHP: Using $ this quand pas dans le contexte d'objet
- Copier le code: Erreur fatale: Utiliser $ this quand il n'est pas dans un contexte d'objet
- Tout "Utiliser $ this quand il n'est pas dans un contexte d'objet" Questions sur
Remarque: Décalage de chaîne non initialisé: *
Comme son nom l'indique, ce type d'erreur se produit lorsque vous tentez probablement d'itérer ou de trouver une valeur dans le tableau avec une clé non existante.
Considérez-vous, essayez d'afficher 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 se termine en écho à D
vous obtenez l'erreur, car dans la boucle for()
, vous avez dit à PHP de vous montrer le caractère de la première à la cinquième corde de 'ABCD'
Qui existe, mais depuis le la boucle commence à compter à partir de 0
et fait écho à D
au moment où elle atteint 4
, elle va lancer une erreur de décalage.
Erreurs similaires:
- Chaîne illégale offset 'option 1'
Remarque: Utilisation de la constante non définie XXX - supposée 'XXX'
ou, en PHP 7.2 ou plus tard:
Attention: utilisation de la constante non définie XXX - supposée 'XXX' (ceci provoquera une erreur dans une future version de PHP)
Cette notification se produit lorsqu'un jeton est utilisé dans le code et semble être une constante, mais une constante de ce nom n'est pas définie.
L'une des causes les plus fréquentes de cet avis est l'omission de citer une chaîne utilisée comme clé de tableau associative.
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 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 cette bibliothèque.
Questions connexes:
Rien n'est vu. La page est vide et blanche.
Aussi connu comme la page blanche de la mort ou écran blanc de la mort . Cela se produit lorsque le rapport d'erreurs est désactivé et qu'une erreur fatale (souvent une erreur de syntaxe) s'est produite.
Si la journalisation des erreurs est activée, vous trouverez le message d'erreur concret dans votre journal des erreurs. Ce sera généralement dans un fichier appelé "php_errors.log", soit dans un emplacement central (par exemple /var/log/apache2
sur de nombreux environnements Linux) ou dans le répertoire du script lui-même (parfois utilisé dans un environnement d'hébergement partagé).
Parfois, il peut être plus simple d'activer temporairement l'affichage des erreurs. La page blanche affichera alors le message d'erreur. Faites 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 définira le rapport au plus haut niveau.
Puisque ini_set()
est exécuté à l'exécution, il n'a aucun effet sur les erreurs d'analyse syntaxique. Ces erreurs apparaîtront dans le journal. Si vous voulez les afficher dans la sortie (par exemple dans un navigateur), vous devez définir la directive display_startup_errors
sur true
. Faites-le soit dans le php.ini
ou dans un .htaccess
ou par toute autre méthode qui affecte la configuration avant l' exécution .
Vous pouvez utiliser les mêmes méthodes pour définir les directives log_errors et log_errors afin de choisir votre propre emplacement de fichier journal.
En regardant dans le journal ou en utilisant l'affichage, vous obtiendrez un message d'erreur beaucoup mieux et la ligne de code où votre script s'arrête.
Questions connexes:
- L'écran blanc de la mort de PHP
- Écran blanc de la mort!
- PHP n'affiche pas les messages d'erreur
- PHP émettant 500 sur les erreurs - où est-ce documenté?
- Comment obtenir des messages d'erreur utiles en PHP?
- Toutes les questions de "White Page of Death" PHP sur
Erreurs liées:
- Erreur d'analyse: erreur de syntaxe, inattendue T_XXX
- Erreur fatale: appel à une fonction membre ... sur un non-objet
- Le code ne fonctionne pas / ce qui ressemble à des parties de mon code PHP sont sorties
Code doesn't run/what looks like parts of my PHP code are output
If you see no result from your PHP code whatsoever and/or you are seeing parts of your literal PHP source code output in the webpage, you can be pretty sure that your PHP isn't actually getting executed. If you use View Source in your browser, you're probably seeing the whole PHP source code file as is. Since PHP code is embedded in <?php ?>
tags, the browser will try to interpret those as HTML tags and the result may look somewhat confused.
To actually run your PHP scripts, you need:
- a web server which executes your script
- to set the file extension to .php, otherwise the web server won't interpret it as such*
- to access your .php file via the web server
* Unless you reconfigure it, everything can be configured.
This last one is particularly important. Just double clicking the file will likely open it in your browser using an address such as:
file://C:/path/to/my/file.php
This is completely bypassing any web server you may have running and the file is not getting interpreted. You need to visit the URL of the file on your web server, likely something like:
http://localhost/my/file.php
You may also want to check whether you're using short open tags <?
instead of <?php
and your PHP configuration has turned short open tags off.
Also see PHP code is not being executed, instead code shows on the page
Notice: Array to string conversion
This simply happens if you try to treat an array as a string:
$arr = array('foo', 'bar');
echo $arr; // Notice: Array to string conversion
$str = 'Something, ' . $arr; // Notice: Array to string conversion
An array cannot simply be echo
'd or concatenated with a string, because the result is not well defined. PHP will use the string "Array" in place of the array, and trigger the notice to point out that that's probably not what was intended and that you should be checking your code here. You probably want something like this instead:
echo $arr[0]; // displays foo
$str = 'Something ' . join(', ', $arr); //displays Something, foo, bar
Or loop the array:
foreach($arr as $key => $value) {
echo "array $key = $value";
// displays first: array 0 = foo
// displays next: array 1 = bar
}
If this notice appears somewhere you don't expect, it means a variable which you thought is a string is actually an array. That means you have a bug in your code which makes this variable an array instead of the string you expect.
Notice: Trying to get property of non-object error
Happens when you try to access a property of an object while there is no object.
A typical example for a non-object notice would be
$users = json_decode('[{"name": "hakre"}]');
echo $users->name; # Notice: Trying to get property of non-object
In this case, $users
is an array (so not an object) and it does not have any properties.
This is similar to accessing a non-existing index or key of an array (see Notice: Undefined Index ).
This example is much simplified. Most often such a notice signals an unchecked return value, eg when a library returns NULL
if an object does not exists or just an unexpected non-object value (eg in an Xpath result, JSON structures with unexpected format, XML with unexpected format etc.) but the code does not check for such a condition.
As those non-objects are often processed further on, often a fatal-error happens next on calling an object method on a non-object (see: Fatal error: Call to a member function ... on a non-object ) halting the script.
It can be easily prevented by checking for error conditions and/or that a variable matches an expectation. Here such a notice with a DOMXPath example:
$result = $xpath->query("//*[@id='detail-sections']/div[1]");
$divText = $result->item(0)->nodeValue; # Notice: Trying to get property of non-object
The problem is accessing the nodeValue
property (field) of the first item while it has not been checked if it exists or not in the $result
collection. Instead it pays to make the code more explicit by assigning variables to the objects the code operates on:
$result = $xpath->query("//*[@id='detail-sections']/div[1]");
$div = $result->item(0);
$divText = "-/-";
if ($div) {
$divText = $div->nodeValue;
}
echo $divText;
Related errors:
- Avis: Index indéfini
- Fatal error: Call to a member function ... on a non-object
Warning: Division by zero
The warning message 'Division by zero' is one of the most commonly asked questions among new PHP developers. This error will not cause an exception, therefore, some developers will occasionally suppress the warning by adding the error suppression operator @ before the expression. Par exemple:
$value = @(2 / 0);
But, like with any warning, the best approach would be to track down the cause of the warning and resolve it. The cause of the warning is going to come from any instance where you attempt to divide by 0, a variable equal to 0, or a variable which has not been assigned (because NULL == 0) because the result will be 'undefined'.
To correct this warning, you should rewrite your expression to check that the value is not 0, if it is, do something else. If the value is zero you should not divide, or change the value to 1 and then divide so the division results in the equivalent of having divided only by the additional variable.
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
}
Related Questions:
Warning: Illegal string offset 'XXX'
This happens when you try to access an array element with the square bracket syntax, but you're doing this on a string, and not on an array, so the operation clearly doesn't make sense .
Exemple:
$var = "test";
echo $var["a_key"];
If you think the variable should be an array, see where it comes from and fix the problem there.