Undefinierter Index mit PHP Post

Habdul Hazeez 15 Februar 2024
  1. Reproduzieren Sie den Fehler Undefinierter Index
  2. Verwenden Sie isset(), um den Inhalt von $_POST zu überprüfen
  3. Verwenden Sie array_key_exists(), um die Schlüssel in $_POST zu suchen
  4. Benutzen Sie in_array um zu prüfen, ob ein Wert in $_POST vorhanden ist
  5. Verwenden Sie den Null-Coalescing-Operator (??)
Undefinierter Index mit PHP Post

Dieser Artikel lehrt vier Lösungen für undefinierten Index in PHP $_POST. Die Lösungen verwenden isset(), array_key_exists(), in_array() und den Null-Coalescing-Operator.

Zuerst reproduzieren wir den Fehler, bevor wir die Lösungen erläutern. In PHP 8 hingegen ist undefinierter Index dasselbe wie undefinierter Array-Schlüssel.

Reproduzieren Sie den Fehler Undefinierter Index

Um den Fehler zu reproduzieren, laden Sie XAMPP oder WAMP herunter und erstellen Sie ein Arbeitsverzeichnis in htdocs. Speichern Sie das folgende HTML-Formular in Ihrem Arbeitsverzeichnis als sample-html-form.html.

Das Formular hat zwei Eingabefelder, die den Vor- und Nachnamen eines Benutzers akzeptieren. Sie werden auch feststellen, dass wir das action-Attribut des Formulars auf 0-reproduce-the-error.php gesetzt haben.

Code - Beispiel-HTML-Formular.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-reproduziere-den-Fehler.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);
    }
?>

Öffnen Sie nun das HTML-Formular in Ihrem Webbrowser. Geben Sie dann leere Zeichenfolgen in die Eingabefelder ein und klicken Sie auf die Schaltfläche Senden.

In PHP 5 erhalten Sie eine Ausgabe wie im folgenden Bild gezeigt. Das Bild zeigt, dass undefined index ein Notice in PHP 5 ist.

Ausgabe:

Undefinierter Index in PHP 5

Wenn Sie PHP 8 verwenden, wird undefinierter Index zu undefinierter Array-Schlüssel. Außerdem ist undefined array key im Gegensatz zu PHP 5 eine Warnung in PHP 8.

Ausgabe:

Undefinierter Array-Schlüssel in PHP 8

Als Nächstes zeigen wir Ihnen verschiedene Möglichkeiten, wie Sie das Problem lösen können.

Verwenden Sie isset(), um den Inhalt von $_POST zu überprüfen

Mit isset() können Sie $_POST überprüfen, bevor Sie einen seiner Inhalte verwenden. Richten Sie zuerst eine if...else-Anweisung ein, die isset() in ihrer Bedingungsprüfung verwendet.

Der Code im if-Block soll nur ausgeführt werden, wenn isset() true zurückgibt. Dadurch vermeiden Sie den Fehler undefinierter Index.

Im folgenden Code prüfen wir, ob die Namensattribute des HTML-Formulars in $_POST vorhanden sind. Außerdem stellen wir sicher, dass der Benutzer keine leeren Zeichenfolgen eingegeben hat.

Wenn die Prüfung true ergibt, drucken wir die vom Benutzer bereitgestellten Daten. Speichern Sie den PHP-Code als 1-fix-with-isset.php in Ihrem Arbeitsverzeichnis und verknüpfen Sie ihn mit dem HTML-Formular.

Code - 1-fix-mit-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.";
    }
?>

Ausgabe (wenn der Benutzer leere Werte liefert):

Senden eines Formulars mit leeren Details

Verwenden Sie array_key_exists(), um die Schlüssel in $_POST zu suchen

Das array_key_exists() sucht, wie der Name schon sagt, nach einem Schlüssel in $_POST. In unserem Fall sind diese Schlüssel die Namensattribute der HTML-Formulareingaben.

Wir verarbeiten das Formular nur, wenn array_key_exists() die Namensattribute in $_POST findet. Sicherheitshalber verwenden wir die Funktion empty(), um sicherzustellen, dass der Benutzer einige Daten eingegeben hat.

All dies finden Sie im folgenden Code. Um den Code zu testen, speichern Sie ihn als 2-fix-with-array-key-exists.php in Ihrem Arbeitsverzeichnis und verknüpfen Sie ihn mit Ihrem HTML-Formular, indem Sie den Wert des Attributs action aktualisieren.

Führen Sie nun die folgenden Schritte aus.

  1. Öffnen Sie die HTML-Datei in Ihrem Code-Editor.
  2. Aktualisieren Sie das Attribut name der Eingabe First name auf first_nam (wir haben das letzte e gelöscht).
  3. Wechseln Sie zu Ihrem Webbrowser und geben Sie den Vor- und Nachnamen ein.

Wenn Sie das Formular mit den richtigen Daten ausfüllen, tritt ein Fehler auf. Das liegt daran, dass zwischen first_nam und first_name eine Diskrepanz besteht.

Das PHP-Skript erwartete letzteres, bekam aber ersteres. Ohne die Fehlerprüfung erhalten Sie den undefined index oder den 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.";
    }
?>

Ausgabe (achten Sie auf den hervorgehobenen Teil in DevTools):

Ausfüllen eines HTML-Formulars mit falschen Namensattributen

Benutzen Sie in_array um zu prüfen, ob ein Wert in $_POST vorhanden ist

Die PHP-Funktion in_array() kann $_POST nach einem bestimmten Wert durchsuchen. Wenn wir dies wissen, können wir es verwenden, um zu bestätigen, ob der Benutzer das HTML-Formular ausgefüllt hat.

Zusammen mit der Funktion empty() können wir sicherstellen, dass der Benutzer keine leeren Zeichenfolgen angegeben hat. Sowohl die Suche als auch die Leerheitsprüfung verhindert undefined index oder den undefined array key.

Im unten aufgeführten Beispiel verwenden wir in_array und empty(), um den Fehler undefined index zu verhindern. Speichern Sie den PHP-Code als 3-fix-with-in-array.php und setzen Sie dann das action-Attribut des HTML mit dem Namen der PHP-Datei.

Öffnen Sie das HTML-Formular, füllen Sie das Feld Nachname aus und lassen Sie das Feld Vorname leer. Senden Sie das Formular ab und Sie erhalten die benutzerdefinierte Fehlermeldung, weil in_array den Vornamen in $_POST nicht gefunden hat.

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.";
    }
?>

Ausgabe:

Füllen eines Eingabefeldes im HTML-Formular

Verwenden Sie den Null-Coalescing-Operator (??)

Der Null-Koaleszenz-Operator (??) gibt den Operanden auf seiner linken Seite zurück, falls er existiert. Andernfalls wird der rechte Operand zurückgegeben.

Mit diesem Wissen können wir einen Eingabewert an den Null-Coalescing-Operator übergeben. Wenn der Wert vorhanden ist, gibt der Operator ihn daher zurück; andernfalls sorgen wir dafür, dass ein anderer Wert zurückgegeben wird.

Im folgenden Code prüfen wir, ob der Null-Coalescing-Operator diesen anderen Wert zurückgegeben hat. Wenn dies der Fall ist, bedeutet dies, dass sich eine der Formulareingaben nicht in $_POST befindet.

Damit können wir eine andere benutzerdefinierte Fehlermeldung als undefined index oder undefined array key. Speichern Sie den Code als 4-fix-with-null-coalescing-operator.php und verknüpfen Sie ihn mit Ihrem HTML-Formular.

Öffnen Sie dann Ihren Webbrowser und füllen Sie das Formular mit den richtigen Daten aus. Beim Absenden des Formulars erhalten Sie keine Fehlermeldungen.

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.";
    }
?>

Ausgabe:

Ein korrekt ausgefülltes HTML-Formular

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