Comment corriger notices Undefined variable, Undefined index, Undefined array key et Undefined offset en PHP ?

Lorsque vous programmez dans PHP, il est très probable que vous tombiez sur des erreurs lors de la compilation et nous allons voir comment débuger les erreurs : "Notice: Undefined variable", "Notice: Undefined index", "Warning: Undefined array key", and "Notice: Undefined offset"

Comment corriger notices Undefined variable, Undefined index,  Undefined array key et Undefined offset en PHP ?

Dans votre vie de développeur, un jour ou l'autre, vous allez rencontrer au moins l'une de ces erreurs : "Notice: Undefined variable", "Notice: Undefined index", "Warning: Undefined array key", and "Notice: Undefined offset" et dans cet article nous allons vous expliquer pourquoi vous rencontrez ces erreurs et comment vous pouvez vous en débarrasser facilement. Mais posons-nous d'abord une question qui doit être éclaircie :

A quoi servent les erreurs en PHP ?

En PHP, tout comme dans d'autres langages de programmation, les messages d'erreur servent à indiquer au programmeur ce qui ne marche pas dans son code et qui devrait être corrigé. Notez que les messages d'erreur PHP ne sont pas une mauvaise chose en soit, ils sont d'ailleurs très important dans le processus de programmation et donc; en tant que nouveau programmeur, vous devez vous y habituer et ne pas à tout prix vous décourager quand vous les rencontrer.

Les erreurs que nous venons de mentionner s'affichent de la manière suivante :

Notice: Undefined variable: nom_de_variable in C:\wamp\www\monprojet\index.php on line 10

Notice: Undefined index: mon_index C:\wamp\www\monprojet\index.php on line 11

Warning: Undefined array key "index_tableau" in C:\wamp\www\monprojet\index.php on line 11

Warning: Undefined offset "10" in C:\wamp\www\monprojet\index.php on line 131

Ces messages d'erreur PHP sont destinés à aider le programmeur PHP à repérer une faute de frappe ou une erreur lors de l'accès à une variable (ou à un élément de tableau) qui n'existe pas. Ainsi, un bon programmeur doit :

  1. S'assurer que chaque variable ou clé de tableau est déjà définie au moment où elle va être utilisée. Si une variable doit être utilisée à l'intérieur d'une fonction, elle doit être passée à cette fonction en tant que paramètre.
  2. Prêter attention à cette erreur et procéder à sa correction, comme pour toute autre erreur. Elle peut indiquer une faute d'orthographe ou qu'une procédure n'a pas renvoyé les données qu'elle aurait dû.
  3. En des rares occasions, lorsque les choses ne sont pas sous le contrôle du programmeur, utiliser un code pour contourner cette erreur. Mais il ne faut en aucun cas en faire une habitude irréfléchie.

L'avantage de ces erreurs « undefined » ou littéralement « non définies » est d'attirer l'attention sur des problèmes que vous n'avez peut-être pas anticipés.

Ces messages « undefined » indiquent qu'une variable ou une clé de tableau n'a pas été définie avant la tentative d'utilisation. Ce sont des messages utiles qui vous avertissent d'une erreur de syntaxe ou d'une rupture dans la fluidité du flux de données dans votre code, et c'est donc une bonne pratique que de traiter les problèmes qu'ils soulèvent plutôt que de les supprimer ou de les contourner.

Nous allons examiner séparément ce que les messages « undefined » nous apprennent et comment résoudre les problèmes qu'ils signalent.

Comment résoudre l'erreur PHP "Notice: Undefined variable" ?

Bien que PHP n'exige pas la déclaration d'une variable, il la recommande afin d'éviter les failles de sécurité ou les bogues, lorsque l'on oublie de donner une valeur à une variable qui sera utilisée plus tard dans le script. Dans le cas de variables non déclarées, PHP émet une erreur de niveau E_WARNING.

Cet avertissement aide le programmeur à repérer un nom de variable mal orthographié ou un type d'erreur similaire (par exemple, une variable s'est vue attribuer une valeur à l'intérieur d'une condition évaluée à false). De plus, il y a d'autres problèmes possibles avec les variables non initialisées. Comme indiqué dans le manuel PHP.

Notons que les variables causent souvent problème lorsqu'on fait l'inclusion d'un fichier PHP dans un autre. Rassurez-vous que vos deux fichiers ont des variables aux noms différents car si le fichier principal.php contient la variable $isOnline = true et que le fichier a_inclure.php contient le fichier $isOnline = "yes", vous risquez de vous compliquer la vie avec les valeurs de ces variables.

Fichier principal.php 

<?php

$isOnline = true;
include "a_inclure.php";
echo $isOnline;

Fichier a_inclure.php

<?php

$isOnline = 2;

Si vous exécutez ce script, sans surprise, il va afficher la valeur "2"

Que signifie "Notice :  undefined variable" ?

Notice: Undefined variable: nom_de_variable in C:\wamp\www\monprojet\index.php on line 10

En language clair, cette erreur veut tout simplement dire que la variable $nom_de_variable que vous voulez utiliser n'est pas définie avant son utilisation à la ligne 10 de votre script.

Plusieurs solutions existent pour résoudre ce problème :

Solution 1 : Déclaration des variables (recommandée) : Déclarez chaque variable avant de l'utiliser. De cette manière, vous ne verrez cette erreur que lorsque vous commettrez une erreur en essayant d'utiliser une variable inexistante - la raison même de l'existence de ce message d'erreur.

C'est vrai que les variables en PHP n'ont pas besoin d'être initialisées, mais la documentation PHP recommande de le faire. Initialiser les variables en fonction du type de données qu'elles contiennent :

  • Entiers à 0.
  • Les booléens à false.
  • Les chaînes de caractères à une chaîne vide ''.
  • Les tableaux à un tableau vide []. 

Par exemple :

$monNombre = 0 ;
$monText = '' ;
$monBooleen = false ;
$monTableau = [] ;

// affichage des valeurs initialisées
echo $monNombre .PHP_EOL ;
echo $monText .PHP_EOL ;
echo $monBooleen .PHP_EOL ; // 'false' renvoie une chaîne vide
print_r($monTableau) ;

// faute de frappe dans le nom de la variable
echo $monTxet ;
Notez qu'en PHP, false renvoie une chaîne vide, et true renvoie une valeur de 1.

Lorsque nous exécutons ce script, nous obtenons l'erreur « Warning: Undefined variable » à cause de la mauvaise orthographe du nom de la variable $monTxet :

0

Array()
Warning: Undefined variable $monTxet in C:\wamp\www\monprojet\index.php on line 14

Les avantages de l'initialisation des variables sont que vous pouvez être certain qu'une variable contient la valeur prévue et que votre code est plus facile à comprendre et à corriger.

PHP : variable non reconnue dans une fonction

Un cas particulier où une variable est définie mais n'est pas visible dans une fonction. Les fonctions en PHP ont leur propre portée de variable, et si vous avez besoin d'utiliser dans une fonction une variable extérieure, sa valeur doit être passée en tant que paramètre de la fonction :

function saluer($parametre) {
    return "Bonjour " . $parametre; 
}
$prenom = "Paterne" ;
echo saluer($prenom) ; // la valeur de $prenom est maintenant accessible à l'intérieur par l'intermédiaire de $parametre

Pourquoi j'ai undefined variable avec les fonctions include ou require ?

L'un des problèmes qui m'avaient vraiment cassé les dents quand je débutais avec PHP, c'était cette erreur "undefined variable" quand je faisais des inclusions des fichiers dans mes fonctions. J'y passais des heures, mais je peux vous dire tout de suite que require() ou include() n'y sont pour rien.

Si vous avez une erreur "undefined variable" lorsque vous faites une inclusion dans une fonction, sachez que cette erreur n'est pas liée à include() ou require() mais c'est plutôt un problème lié à la portée de votre variable (variable scope) en anglais.

Imaginons que nous ayons deux fichiers :  bdd.php et index.php. Le fichier bdd.php nous permet d'instancier notre objet qui fait la connexion à la base de données grâce à PDO. Et index.php nous permet de lire les derniers articles de notre base de données.

Fichier bdd.php

<?php

try
{
	$bdd = new PDO('mysql:host=localhost; dbname=ma_base_de_donnees', 'root', '');
}
catch (Exception $e)
{
	die('Erreur : '.$e->getMessage());
}

Fichier index.php

<?php

include 'bdd.php';

function mesArticles(){
	$mesArticles = array();
	$sql = 'SELECT * FROM articles WHERE etat=1 ORDER BY id DESC LIMIT 3';
	$req=$bdd->query($sql);
	while($resultat = $req->fetch())
	{
		$mesArticles[$resultat['id']] = $resultat;
	}
	return $mesArticles;
}
$lesArticles = mesArticles();

Avec ceci, vous vous attendez à ce que votre fonction qui est dans index.php utilise la variable $bdd qui est dans bdd.php pour se connecter à la base de données et vous restituer les derniers articles de votre table. Mais au lieu d'avoir le résultat attendu, vous allez avec l'erreur suivante : 

Notice: Undefined variable: bdd in C:\wamp64\www\monprojet\index.php on line 8

Ce qui cause ce problème est que votre fonction ne sait pas retrouver votre variable $bdd. Vous avez comme précédemment le choix de passer cette variable en paramètre comme ceci : 

<?php

include 'bdd.php';

//Dire que notre fonction va recevoir un paramètre qui sera l'objet qui nous permet de nous connecter à la BDD
function mesArticles($bdd_objet){
	$mesArticles = array();
	$sql = 'SELECT * FROM articles WHERE etat=1 ORDER BY id DESC LIMIT 3';
	$req=$bdd_objet->query($sql);
	while($resultat = $req->fetch())
	{
		$mesArticles[$resultat['id']] = $resultat;
	}
	return $mesArticles;
}

//Passer en argument notre instance ($bdd) lorsque nous voulons utiliser notre fonction
$lesArticles = mesArticles($bdd);

ou bien de demander à php de donner à cette variable une portée globale grâce au mot-clé "global" placé devant le nom de la variable :

<?php

include 'bdd.php';

function mesArticles(){
	global $bdd; //nous disons à PHP que la variable $bdd que nous voulons utilisée est en dehors de notre fonction
	$mesArticles = array();
	$sql = 'SELECT * FROM articles WHERE etat=1 ORDER BY id DESC LIMIT 3';
	$req=$bdd->query($sql);
	while($resultat = $req->fetch())
	{
		$mesArticles[$resultat['id']] = $resultat;
	}
	return $mesArticles;
}
$lesArticles = mesArticles();

En faisant cela, vous n'aurez plus l'erreur "undefined variable".

Solution 2 : Supprimez l'erreur avec l'opérateur de coalescence null (??) : Le plus grand inconvénient de cette solution est que PHP ne pourra pas vous informer de l'utilisation d'un nom de variable incorrect. 

Pour contourner l'avertissement « Variable non définie », utilisez l'opérateur de coalescence null ( ??) pour attribuer une valeur par défaut lorsque la valeur est nulle. Par exemple, pour affecter une chaîne vide à la variable non déclarée et non initialisée $chaine :

// chaîne vide comme valeur par défaut
echo $chaine ? ? '' ;

Pour les anciennes versions de PHP (< 7.0), la fonction isset() avec le ternaire peut être utilisé

echo isset($chaine) ? $chaine : '';
Sachez cependant qu'il s'agit toujours d'une suppression d'erreur, bien que cela soit d'une manière particulière. Cela peut donc empêcher PHP de vous aider à dénicher une variable non initialisée.

Solution 3 : Supprimez l'erreur avec l'opérateur @ :  cette solution a été laissée peut être pour des raisons historiques ou nostalgiques, mais sérieusement elle ne devrait même plus être utilisable à ce jour.

echo @$variable_inexistante; //ne va pas afficher d'erreur

Si votre but n'est pas de corriger les erreurs, mais plutôt de les cacher, il y a un article qui te montre comment cacher les erreurs et avertissements sur un site PHP.

Comment résoudre l'erreur PHP "Warning: Undefined array key" ?

Depuis PHP 8, l'avertissement « Undefined array key » remplace les avertissements « Undefined offset » et « Undefined index » des versions précédentes.

L'avertissement « Undefined array key » vous indique que votre code fait référence à une clé de tableau sans valeur.

Par exemple, la clé nation n'existe pas dans le tableau identité suivant :

$identite = array(
	'prenom'=>'Robert',
	'nom'=>'Mugabe',
	'genre'=>'Masculin',
	'age'=>'Adulte',
	'pays'=>'Zimbabwéenne',
);
echo $identite['nationalite'];

Affichage :

Warning: Undefined array key "nationalite" in C:\wamp64\www\exemple\index.php on line 11

Pour résoudre ce problème, vous pouvez définir une clé de tableau en initialisant sa valeur avant de l'utiliser. Pour notre exemple nous voulons afficher zimbabwéenne et la clé correspondante que nous avons mise est "pays" et non "nationalite". Pour cela nous avons juste besoin de modifier la clé pays et mettre nationalite et nous obtiendrons le résultat escompté. Notre exemple précédent va résembler à ceci :

$identite = array(
	'prenom'=>'Robert',
	'nom'=>'Mugabe',
	'genre'=>'Masculin',
	'age'=>'Adulte',
	'nationalite'=>'Zimbabwéenne',
);
var_dump($identite['nationalite']);
NB : Nous avons utilisé la fonction var_dump pour afficher le résultat de la ligne 11

Affichage :

C:\wamp64\www\exemple\index.php:11:string 'Zimbabweenne' (length=12)

Une autre façon de faire c'est d'initialiser la valeur qui cause problème avant de l'afficher comme nous l'avons vu dans la section précédente en rapport avec les variables inconnues. Mais l'idéal c'est de comprendre qu'est ce qui cause problème et d'y apporter des solutions adéquates.

Assurez-vous toujours que le flux de données de votre script ou de votre application fonctionne comme prévu. Par exemple, vérifiez que les clés initialisées sont mises à jour plus tard dans votre code si vous en avez besoin.

Si vous travaillez avec des tableaux externes, tels que les variables superglobales $_SERVER ou $_POST, vous pouvez éviter les notifications « non définies » en vérifiant qu'une valeur existe avant de l'utiliser. Utilisez la fonction isset() ou la fonction empty() avec l'opérateur logique NOT ( !) pour vérifier si une valeur existe. En voici un exemple :

if (isset($identite['nationalite'])) {
  echo $identite['nationalite'];
}

if (!empty($identite['nationalite'])) {
  echo $identite['nationalite'];
}

Comment résoudre l'erreur PHP "Notice: Undefined index" ?

Dans les versions de PHP antérieures à la 8.2, la notification « Undefined index » survient lorsque vous utilisez une clé de tableau de chaînes qui n'a pas de valeur assignée. Cela peut arriver si vous vous trompez dans l'orthographe d'une clé, qui n'existe donc pas. Par exemple :

$identite = ['prenom' => 'John', 'nom' => 'Doe'];
echo $identite['pernom'];

Affichage : 

Notice: Undefined index: fristName in ../var/www/index.php on line 3

Notice: Undefined index: pernom in C:\wamp64\www\exemple\index.php on line 11

Vous remarquerez qu'ici nous avons appelé "pernom" alors que nous avions renseigner "prenom".

Pour résoudre ce problème, examinez votre flux de données pour vous assurer que les valeurs des tableaux sont remplies avant d'être utilisées et que vous ne vous êtes pas trompé de nom de votre index; ici "prenom".

Dans le cas des variables superglobales, nous pouvons recevoir la notification « Undefined index » lorsque notre code fait référence à une clé qui ne contient pas de valeur. Par exemple, si nous essayons d'afficher l'adresse IP du client d'un réseau partagé alors qu'aucune adresse n'est utilisée :

echo $_SERVER['HTTP_CLIENT_IP'];

Affichage :

Notice: Undefined index: HTTP_CLIENT_IP in C:\wamp64\www\exemple\index.php on line 3

Vous pouvez résoudre ce problème en vérifiant si la valeur existe avant de l'utiliser. Utilisez la fonction isset() ou la fonction empty() avec l'opérateur logique NOT ( !) pour vérifier si la valeur existe. En voici un exemple :

// en utilisant la fonction `isset()`.
if(isset($_SERVER['HTTP_CLIENT_IP'])) {
  echo $_SERVER['HTTP_CLIENT_IP'] ;
}

// utilisation de `!` avec la fonction `empty()`.
if(!empty($_SERVER['HTTP_CLIENT_IP'])) {
  echo $_SERVER['HTTP_CLIENT_IP'] ;
}

Comment résoudre l'erreur PHP "Notice: Undefined offset" ?

Dans les versions de PHP inférieures à 8, la notification « Undefined offset » est donnée lorsque vous essayez d'accéder à un élément de tableau avec un index invalide, c'est-à-dire que l'index est en dehors des limites du tableau.

$fruits = ['pomme', 'banane', 'orange'] ;
 echo $fruits[3] ;

Ceci va afficher une erreur car l'index du tableau commence par zéro (0) et non 1. Donc dans le tableau ci-dessus, le dernier index est "2". Vouloir afficher l'index trois donnera nécessairement une erreur.

Notice: Undefined offset: 3 in C:\wamp64\www\exemple\index.php on line 2

Une façon d'éviter d'accéder à un élément avec un index invalide est d'utiliser la fonction isset() dans une instruction if pour vérifier si l'élément à un index donné existe.

$fruits = ['pomme', 'banane', 'orange'] ;

if (isset($fruits[3])) {
  echo $fruits[3] ;
}

Par ailleurs, si vous travaillez avec des clés numériques, vous pouvez utiliser la fonction count() pour déterminer la longueur du tableau et utiliser ensuite les clés numériques dans cette plage. Par exemple, nous pouvons accéder à la valeur du dernier élément en soustrayant la longueur du tableau de 1.

$fruits = ['pomme', 'banane', 'orange'];

echo $fruits[count($fruits) - 1];

Ceci va afficher à votre écran la valeur "orange".

Quelle est la différence entre "Notice: Undefined index", "Notice : Undefined offset" et  "Warning: Undefined array key" ?

En bref, tous ces avertissements apparaîssent lorsque vous (ou PHP) essayez d'accéder à un index non défini d'un tableau. Mais pour cela il faut isoler les cas possibles :

Les tableaux internes

Lorsqu'il s'agit de tableaux internes, définis dans votre code, l'attitude doit être exactement la même : il suffit d'initialiser toutes les clés avant de les utiliser. De cette façon, cette erreur remplira sa fonction : informer le programmeur d'une erreur dans son code.

//Initialisation d'une variable
$tableau['valeur'] = "" ; //Valeur d'initialisation ; 0 pour int, [] pour array,  "" pour chaine de caractère, etc.
echo $tableau['valeur'] ; // pas d'erreur
echo $tableau['valuer'] ; // une erreur indique une clé mal orthographiée

Un cas particulier est celui où une fonction renvoie soit un tableau, soit une autre valeur telle que null ou false. Elle doit alors être testée avant d'essayer d'accéder aux éléments du tableau, comme par exemple :

$resultat = $req->fetch() ;
if ($resultat) { // l'enregistrement a été trouvé et peut être utilisé
    echo $resultat['nom'] ; 
}

Les tableaux externes

Avec les tableaux externes (tels que $_POST / $_GET / $_SESSION ou les entrées JSON), la situation est un peu différente, car le programmeur n'a pas le contrôle du contenu de ces tableaux. Il peut donc être justifié de vérifier l'existence d'une clé ou même d'attribuer une valeur par défaut à une clé manquante.

  • Lorsqu'un script PHP contient un formulaire HTML, il est naturel qu'au premier chargement il n'y ait pas de contenu de formulaire. Par conséquent, un tel script doit vérifier si un formulaire a été soumis. 
     // pour les formulaires POST, vérifier la méthode de requête
      if ($_SERVER['REQUEST_METHOD'] === 'POST') {
          // traiter le formulaire
      }
      // pour les formulaires / liens GET, vérifier le champ important
      if (isset($_GET['search'])) {
          // traiter le formulaire
      }
  • Certains éléments de formulaire HTML, tels que les cases à cocher, ne sont pas envoyés au serveur s'ils ne sont pas cochés. Dans ce cas, il est justifié d'utiliser un opérateur de fusion des valeurs nulles pour attribuer une valeur par défaut. 
     $licence = $_POST['terms'] ?? false;
  • Les éléments facultatifs ou les cookies doivent être traités de la même manière 
     $limit = $_GET['limit'] ?? 20; //Si une limite existe, mettez-la ! Sinon, mettez la valeur 20
     $theme = $_COOKIE['theme'] ?? 'light';

Eviter les erreurs Undefined en PHP

Pour éviter des erreurs "undifined" en PHP, les affectations doivent être faites au tout début du script. Validez toutes les entrées, assignez-les à des variables locales et utilisez-les tout au long du code. Ainsi, chaque variable à laquelle vous allez accéder existera délibérément.