Undefinierter Index mit PHP Post
-
Reproduzieren Sie den Fehler
Undefinierter Index
-
Verwenden Sie
isset()
, um den Inhalt von$_POST
zu überprüfen -
Verwenden Sie
array_key_exists()
, um die Schlüssel in$_POST
zu suchen -
Benutzen Sie
in_array
um zu prüfen, ob ein Wert in$_POST
vorhanden ist -
Verwenden Sie den Null-Coalescing-Operator (
??
)
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:
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:
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):
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.
- Öffnen Sie die HTML-Datei in Ihrem Code-Editor.
- Aktualisieren Sie das Attribut
name
der EingabeFirst name
auffirst_nam
(wir haben das letztee
gelöscht). - 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
):
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:
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:
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