Général

Les PCRE

Les POSIX

Pratique

Linux

Spécial php

Les billets de fred

Notice: Undefined variable (ou index)

Je vais essayer d'expliquer ici, ce que veulent dire "Notice: Undefined variable" et "Notice: Undefined index" et comment les éviter.

Régulièrement, on peut lire sur les forums des questions du genre : "J'essaye d'installer un script que j'ai téléchargé et il m'affiche : Notice : Undefined variable" ou "Depuis la modification de mon serveur, j'ai des messages : Notice : Undefined index". Pas de panique, c'est presque normal !

Pour bien comprendre ce que signifie ce message, observez cet exemple :
<?php
$x = $y + 10;
?>

A l'exécution de ce code, qu'est censé contenir la variable $x ?
Logiquement, on devrait répondre : "Impossible à dire car on ne connaît pas le contenu de la variable $y".

Pour PHP, la réponse est la suivante : "Comme la variable $y n'existe pas, je notifie ça à l'utilisateur et je considère qu'elle ne vaut rien. Dans ce cas : rien + 10 = 10 !"

Il est donc impératif d'affecter une valeur à la variable $y, ce qui donne :
<?php
$y = 27;
$x = $y + 10;
?>

Parfois, cette variable peut être extérieure à votre script (fichier inclus, donnée de formulaire, sessions ... etc.), et il faudra donc procéder de la manière suivante :
<?php
if( ! isset( $y ) ) $y = 0; // l'initialiser si elle n'existe pas
$x = $y + 10;
?>

Il en va de même pour les index d'un tableau. Quand j'utilise le code suivant :
<?php
$mon_tableau = array( 'nom' => 'Charlie', 'animal' => 'furet' );
echo $mon_tableau['email'];
?>

Vous constatez que l'index "email" n'existe pas, d'où le message "Notice : Undefined index email"

Pourquoi avant mes modifications sur le serveur, ça ne s'affichait pas ?

En fait, il existe plusieurs types d'erreurs, les fatales, les avertissements, les notifications, les mauvaises analyses ... etc. L'affichage de ces erreurs est soumis à une sorte de filtrage par l'intermédiaire de la directive de configuration error_reporting.
Dans les distributions de PHP, les auteurs diffusent deux fichiers de configuration : un fichier par défaut et un fichier recommandé. Normalement, le fichier de configuration par défaut est prévu pour être utilisé en développement mais pas en utilisation réelle. Seulement, ce fichier de configuration n'affiche pas toutes les erreurs et filtre les erreurs de type notification.

Remarque : Personnellement, je trouve ça paradoxal car c'est précisément en développement qu'il faudrait afficher toutes les erreurs !

Une chose est sûre, certaines personnes ont eu l'idée d'installer le fichier de configuration recommandé qui lui affiche les erreurs de notification, d'où l'apparition de ces erreurs.

J'ai vérifié, la configuration précédente ne filtrait pas les notifications

Dans ce cas, le problème est différent, c'est certainement la modification de la directive de configuration "register_globals", je vous laisse lire mon article : "Variables auto-déclarées : Pourquoi c'est mal ?"

Sur un script que j'ai téléchargé, l'auteur n'affecte pas toujours les variables, pourquoi faire ça ?

Tout simplement parce que vous êtes tombés sur l'auteur d'un script qui développait avec le filtrage des notifications et qui ne s'est donc jamais soucié de ce problème. En effet, dans certains langages, les variables non initialisées peuvent contenir n'importe quoi, mais avec PHP, une variable non initialisée est considérée comme une chaîne vide, ou 0 si on l'utilise dans le cadre d'une opération arithmétique.

De plus, il est plus rapide d'écrire :
<?php
echo $_GET['id'];
?>

plutôt que
<?php
if( isset( $_GET['id'] ) ) echo $_GET['id'];
?>

A la limite, vous pouvez utiliser l'opérateur "@" pour désactiver ponctuellement les erreurs, ce qui donne :
<?php
echo @$_GET['id'];
?>

Mais je considère cette méthode comme peu rigoureuse, alors vous faites comme vous le sentez !

En fait, ça ne sert pas à grand chose d'afficher ce type d'erreur.

Je ne serais pas aussi catégorique. En effet, cette notification peut vous aider lors de vos développements à détecter certaines erreurs. Par exemple :
<?php
$ligne = db->fetch();
echo $line['id'];
?>

Comme vous pouvez le remarquer, le nom de la variable est différent. Avec le filtrage des notifications, vous allez penser que la méthode de votre objet ne retourne rien, alors que c'est simplement parce que vous n'utilisez pas la bonne variable. De plus, contrairement aux noms des fonctions, PHP est sensible aux majuscules/minuscules pour les noms des variables ce qui conduit parfois à utiliser des variables qui n'existent pas à une majuscule près.

Pour conclure, je vous conseille plus que fortement de ne pas filtrer les notifications lors de vos développements.

Par Frédéric Bouchery
ADAM Benjamin 2008 | Admin