1349 votes

PHP: "notice: Undefined variable" et "notice: Undefined index"

Je suis en cours d'exécution d'un script PHP, et continue de recevoir des erreurs du type:

Undefined variable: user_location in C:\wamp\www\mypath\index.php on line 12

La ligne 12, ressemble à ceci:

$greeting = "Hello, ".$user_name." from ".$user_location;

Que signifient-ils?

Pourquoi apparaissent-ils tout d'un coup? J'ai utilisé ce script depuis des années et il n'a jamais été un problème.

Que dois-je faire pour y remédier?

Est-il une solution rapide?

C'est une Référence Générale à la question pour les gens de lien vers des doublons, au lieu d'avoir à expliquer le problème, encore et encore. Je sens que c'est nécessaire parce que la plupart du monde réel des réponses sur cette question sont très spécifiques.

Liées Méta-discussion:

1207voto

Alin Purcaru Points 21373

De la grande sagesse du Manuel PHP:

En s'appuyant sur la valeur par défaut d'un variable non initialisée est problématique dans le cas de l'inclusion d'un fichier en un autre qui utilise la même variable nom. C'est aussi un risque pour la sécurité avec register_globals allumé. E_NOTICE niveau d'erreur est émis en cas de travailler avec des non initialisée de variables, mais pas dans le cas de en ajoutant des éléments à la tableau non initialisé. la fonction isset()de la langue construire peut être utilisé pour détecter si un variable a déjà été initialisé.

Quelques explications:

Bien que PHP ne nécessite pas de déclaration de variable, il ne le recommandons, afin d'éviter des failles de sécurité ou des bugs où l'on aurait oublier de donner une valeur à une variable qu'il utilisera plus tard dans le script. Ce que PHP fait dans le cas de variables non déclarées est question d'un niveau très faible erreur E_NOTICE, qui n'est même pas signalé par défaut, mais le Manuel conseille pour permettre au cours du développement.

Façons de traiter le problème:

  1. Recommandé: Déclarer vos variables. Ou utiliser isset() pour vérifier si elles sont déclarées avant leur référencement, comme dans: $value = isset($_POST['value']) ? $_POST['value'] : '';.

  2. Définir un gestionnaire d'erreur personnalisé pour E_NOTICE et de rediriger les messages depuis la sortie standard (peut-être à un fichier journal). set_error_handler('myHandlerForMinorErrors', E_NOTICE | E_STRICT).

  3. Désactiver E_NOTICE. Un moyen rapide pour exclure uniquement les E_NOTICE est - error_reporting( error_reporting() & ~E_NOTICE ).

  4. Supprimer l'erreur avec l' opérateur@ .

Remarque: Il est fortement recommandé d'appliquer le point 1.

Connexes:

171voto

ish1301 Points 6724

Essayez ces

Q1: cet avis signifie $varname est pas définis au champ d'application actuel de la script.

Q2: Utilisation de la fonction isset(), empty() conditions avant d'utiliser un suspect variable fonctionne bien.

// recommended solution
$user_name = $_SESSION['user_name'];
if (empty($user_name)) $user_name = '';

OR 

// just define at the top of the script index.php
$user_name = ''; 
$user_name = $_SESSION['user_name'];

OR 

$user_name = $_SESSION['user_name'];
if (!isset($user_name)) $user_name = '';

Solution RAPIDE:

// not the best solution, but works
// in your php setting use, it helps hiding site wide notices
error_reporting(E_ALL ^ E_NOTICE);

78voto

mario Points 76989

Un (souvent découragé) alternative est la suppression d'erreur de l'opérateur @. C'est une construction du langage à l'arrêt non désirées et les avertissements, mais doit être utilisé avec précaution.

Tout d'abord, il encourt une peine de micro-performance sur l'aide d' isset. Ce n'est pas mesurable dans les applications du monde réel, mais doit être considéré dans les données lourd itérations. Deuxièmement, il pourrait bloquer le débogage, mais dans le même temps supprimé les erreurs sont en effet transmis à la coutume des gestionnaires d'erreur (à la différence de la fonction isset décorées expressions).

54voto

Erik Points 2514

Généralement, à cause de "mauvaise programmation", et une possibilité pour les erreurs, maintenant ou plus tard.

  1. Si c'est une erreur, faire une affectation à la variable première: $varname=0;
  2. Si vraiment il n'est défini que parfois, le test: if (isset($nom_var)) .... avant de l'utiliser
  3. Si c'est parce que vous avez mal écrit, juste correct que
  4. Peut-être même des mises en garde en vous PHP-paramètres

48voto

DGM Points 14007

Cela signifie que vous êtes de test, d'évaluation, ou l'impression d'une variable que vous n'avez pas encore attribué rien. Cela signifie que vous soit une faute de frappe, ou vous avez besoin de vérifier que la variable a été initialisée à quelque chose d'abord. Vérifier votre logique chemins, elle peut l'être dans un chemin d'accès, mais pas dans l'autre.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X