Index non défini avec PHP Post

Habdul Hazeez 15 février 2024
  1. Reproduire l’erreur Undefined Index
  2. Utilisez isset() pour vérifier le contenu de $_POST
  3. Utilisez array_key_exists() pour rechercher les clés dans $_POST
  4. Utilisez in_array pour vérifier si une valeur existe dans $_POST
  5. Utiliser l’opérateur de coalescence nulle (??)
Index non défini avec PHP Post

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:

Index indéfini en PHP 5

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:

Clé de tableau non définie en PHP 8

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) :

Soumettre un formulaire avec des détails 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.

  1. Ouvrez le fichier HTML dans votre éditeur de code.
  2. Mettez à jour l’attribut name de l’entrée First name en first_nam (nous avons supprimé le dernier e).
  3. 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) :

Remplir un formulaire HTML avec des attributs de nom incorrects

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:

Remplir un champ de saisie dans le formulaire HTML

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:

Un formulaire HTML rempli correctement

Habdul Hazeez avatar Habdul Hazeez avatar

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