Index non défini avec PHP Post
- Reproduire l’erreur Undefined Index
-
Utilisez
isset()
pour vérifier le contenu de$_POST
-
Utilisez
array_key_exists()
pour rechercher les clés dans$_POST
-
Utilisez
in_array
pour vérifier si une valeur existe dans$_POST
-
Utiliser l’opérateur de coalescence nulle (
??
)
Cet article enseigne quatre solutions à l'index indéfini
en PHP $_POST
. Les solutions utiliseront isset()
, array_key_exists()
, in_array()
, et l’opérateur de coalescence Null.
Tout d’abord, nous allons reproduire l’erreur avant d’expliquer les solutions. Pendant ce temps, dans PHP 8
, undefined index
est identique à undefined array key
.
Reproduire l’erreur Undefined Index
Pour reproduire l’erreur, téléchargez XAMPP
ou WAMP
et créez un répertoire de travail dans htdocs
. Enregistrez le formulaire HTML suivant dans votre répertoire de travail sous le nom sample-html-form.html
.
Le formulaire comporte deux champs de saisie qui acceptent le prénom et le nom d’un utilisateur. Vous remarquerez également que nous avons défini l’attribut d’action du formulaire à 0-reproduce-the-error.php
.
Code - sample-html-form.html
:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Sample HTML Form</title>
<style type="text/css">
body { height: 100vh; display: grid; place-items: center; }
main { display: grid; outline: 3px solid #1a1a1a; width: 50%; padding: 0.5em; }
form { align-self: center; justify-self: center; width: 50%;}
input:not([type="submit"]) { width: 50%; }
input[type="submit"] { padding: 0.5em;}
.form-row { display: flex; justify-content: space-between; margin-bottom: 1rem; }
.form-row:last-child { justify-content: center; }
</style>
</head>
<body>
<main>
<!--
This is a sample form that demonstrates how
to fix the undefined index in post when using
PHP. You can replace the value of the "action"
attribute with any of the PHP code in
this article.
- DelftStack.com
-->
<form method="post" action="0-reproduce-the-error.php">
<div class="form-row">
<label id="first_name">First name</label>
<input name="first_name" type="text" required>
</div>
<div class="form-row">
<label id="last_name">Last name</label>
<input type="text" name="last_name" required>
</div>
<div class="form-row">
<input type="submit" name="submit_bio_data" value="Submit">
</div>
</form>
</main>
</body>
</html>
Code - 0-reproduce-the-error.php
:
<?php
// The purpose of this script is to reproduce
// the undefined index or undefined array
// key error messages. Also, it requires
// that the $_POST array does not contain
// the first_name and last_name indexes.
// DO NOT USE THIS CODE ON PRODUCTION SERVERS.
$first_name = $_POST['first_name'];
$last_name = $_POST['last_name'];
if ($first_name && $last_name) {
echo "Your first name is " . htmlspecialchars($first_name);
echo "Your last name is " . htmlspecialchars($last_name);
}
?>
Maintenant, ouvrez le formulaire HTML dans votre navigateur Web. Tapez ensuite des chaînes vides dans les champs de saisie et appuyez sur le bouton Soumettre.
Dans PHP 5
, vous obtiendrez une sortie comme celle montrée dans l’image suivante. L’image montre que undefined index
est un Notice
dans PHP 5
.
Production:
Si vous utilisez PHP 8
, undefined index
devient undefined array key
. De plus, contrairement à PHP 5
, undefined array key
est un Warning
dans PHP 8
.
Production:
La prochaine chose est de vous montrer différentes façons de le résoudre.
Utilisez isset()
pour vérifier le contenu de $_POST
Avec isset()
, vous pouvez vérifier $_POST
avant d’utiliser l’un de ses contenus. Tout d’abord, configurez une instruction if...else
qui utilise isset()
dans sa vérification conditionnelle.
Le code dans le bloc if
ne doit s’exécuter que si isset()
renvoie true
. En faisant cela, vous éviterez l’erreur undefined index
.
Dans le code ci-dessous, nous vérifions si les attributs de nom du formulaire HTML existent dans $_POST
. De plus, nous nous assurons que l’utilisateur n’a pas entré de chaînes vides.
Si le contrôle renvoie true
, nous imprimons les données fournies par l’utilisateur. Enregistrez le code PHP sous 1-fix-with-isset.php
dans votre répertoire de travail et liez-le au formulaire HTML.
Code - 1-fix-with-isset.php
:
<?php
// It's customary to check that the user clicked
// the submit button.
if (isset($_POST['submit_bio_data']) && !empty($_POST)) {
// In the following "if" statement, we check for
// the following:
// 1. The existence of the first_name last_name
// in $_POST.
// 2. Prevent the user from supplying an empty
// string.
if (isset($_POST['first_name'], $_POST['last_name'])
&& !empty(trim($_POST['first_name']))
&& !empty(trim($_POST['last_name'])))
{
echo "Your first name is " . htmlspecialchars($_POST['first_name']);
echo "Your last name is " . htmlspecialchars($_POST['last_name']);
} else {
// If the user sees the following message, that
// means either first_name or last_name is not
// in the $_POST array.
echo "Please fill all the form fields";
}
} else {
echo "An unexpected error occurred. Please, try again.";
}
?>
Sortie (lorsque l’utilisateur fournit des valeurs vides) :
Utilisez array_key_exists()
pour rechercher les clés dans $_POST
Le array_key_exists()
comme son nom l’indique va chercher une clé dans $_POST
. Dans notre cas, ces clés sont les attributs de nom des entrées du formulaire HTML.
Nous ne traiterons le formulaire que si array_key_exists()
trouve les attributs de nom dans $_POST
. Pour plus de sécurité, nous utilisons la fonction empty()
pour nous assurer que l’utilisateur a saisi certaines données.
Vous trouverez tout cela dans le code suivant. Pour tester le code, enregistrez-le sous 2-fix-with-array-key-exists.php
dans votre répertoire de travail et reliez-le à votre formulaire HTML en mettant à jour la valeur de l’attribut action
.
Maintenant, effectuez les étapes suivantes.
- Ouvrez le fichier HTML dans votre éditeur de code.
- Mettez à jour l’attribut
name
de l’entréeFirst name
enfirst_nam
(nous avons supprimé le derniere
). - Basculez vers votre navigateur Web et remplissez le prénom et le nom.
Une erreur se produira lorsque vous remplirez le formulaire avec les données correctes. C’est parce qu’il y a une incompatibilité entre first_nam
et first_name
.
Le script PHP s’attendait à ce dernier, mais il a obtenu le premier. Sans la vérification des erreurs, vous obtiendrez le message undefined index
ou undefined array key
.
Code - 2-fix-with-array-key-exists.php
:
<?php
// Ensure the user clicked the submit button.
if (isset($_POST['submit_bio_data']) && !empty($_POST)) {
// Use array_key_exists to check for the
// first_name and last_name fields. At the
// same time, prevent the user from supplying
// an empty string. You can also implement other
// validation checks depending on your use case.
if (array_key_exists('first_name', $_POST) && array_key_exists('last_name', $_POST)
&& !empty(trim($_POST['first_name']))
&& !empty(trim($_POST['last_name']))
)
{
echo "Your first name is " . htmlspecialchars($_POST['first_name']) . "<br />";
echo "Your last name is " . htmlspecialchars($_POST['last_name']);
} else {
echo "Please fill all the form fields";
}
} else {
echo "An unexpected error occurred. Please, try again.";
}
?>
Sortie (faites attention à la partie en surbrillance dans DevTools
) :
Utilisez in_array
pour vérifier si une valeur existe dans $_POST
La fonction PHP in_array()
peut rechercher $_POST
pour une valeur spécifique. Sachant cela, nous pouvons l’utiliser pour confirmer si l’utilisateur a rempli le formulaire HTML.
Avec la fonction empty()
, nous pouvons nous assurer que l’utilisateur n’a pas fourni de chaînes vides. La recherche et la vérification du vide empêchent l'index indéfini
ou la clé de tableau indéfinie
.
Dans l’exemple détaillé ci-dessous, nous utilisons in_array
et empty()
pour éviter l’erreur undefined index
. Enregistrez le code PHP sous 3-fix-with-in-array.php
, puis définissez l’attribut action
du HTML avec le nom du fichier PHP.
Ouvrez le formulaire HTML, remplissez le champ Last name
et laissez le champ First name
vide. Soumettez le formulaire et vous obtiendrez le message d’erreur personnalisé car in_array
n’a pas trouvé le prénom dans $_POST
.
Code - 3-fix-with-in-array.php
:
<?php
// Ensure the user clicked the submit button.
if (isset($_POST['submit_bio_data']) && !empty($_POST)) {
// Use in_array to check for the first and last
// name fields. Also, check for empty submissions
// by the user. We advise that you implement other
// checks to suit your use case.
if (in_array('first_name', $_POST) && in_array('last_name', $_POST)
&& !empty(trim($_POST['first_name']))
&& !empty(trim($_POST['last_name']))
)
{
echo "Your first name is " . htmlspecialchars($_POST['first_name']) . "<br />";
echo "Your last name is " . htmlspecialchars($_POST['last_name']);
} else {
echo "Please fill all the form fields";
}
} else {
echo "An unexpected error occurred. Please, try again.";
}
?>
Production:
Utiliser l’opérateur de coalescence nulle (??
)
L’opérateur de coalescence nul (??
) renverra l’opérande sur son côté gauche s’il existe. Sinon, il renverra l’opérande de droite.
Forts de ces connaissances, nous pouvons transmettre une valeur d’entrée à l’opérateur de coalescence Null. Par conséquent, si la valeur existe, l’opérateur la renverra ; sinon, nous lui ferons retourner une autre valeur.
Dans le code ci-dessous, nous allons vérifier si l’opérateur de coalescence Null a renvoyé cette autre valeur. Si c’est le cas, cela signifie qu’une des entrées du formulaire n’est pas dans $_POST
.
Avec cela, nous pouvons afficher un message d’erreur personnalisé autre que undefined index
ou undefined array key
. Enregistrez le code sous 4-fix-with-null-coalescing-operator.php
et liez-le à votre formulaire HTML.
Ensuite, ouvrez votre navigateur Web et remplissez le formulaire avec les données correctes. Vous ne recevrez aucun message d’erreur lorsque vous soumettez le formulaire.
Code - 4-fix-with-null-coalescing-operator.php
:
<?php
// It's customary to check that the user clicked
// the submit button.
if (isset($_POST['submit_bio_data']) && !empty($_POST)) {
// This works in PHP 7 and above. It's called
// the null coalescing operator. It'll return
// the value on the left if it exists or the
// value on the right if it does not. While
// By doing this, we ensure the user does not
// enter empty strings. What's more, you can
// implement other checks for your use case.
$first_name = !empty(trim($_POST['first_name'])) ?? 'Missing';
$last_name = !empty(trim($_POST['last_name'])) ?? 'Missing';
// if the null coalescing operator returns
// the string "Missing" for first_name
// or last_name, that means they are not valid
// indexes of the $_POST array.
if ($first_name && $last_name !== 'Missing') {
echo "Your first name is " . htmlspecialchars($_POST['first_name']) . "<br />";
echo "Your last name is " . htmlspecialchars($_POST['last_name']);
} else {
// If the user sees the following message, that
// means either first_name or last_name is not
// in the $_POST array.
echo "Please fill all the form fields";
}
} else {
echo "An unexpected error occurred. Please, try again.";
}
?>
Production:
Habdul Hazeez is a technical writer with amazing research skills. He can connect the dots, and make sense of data that are scattered across different media.
LinkedIn