PHP Post 的未定义索引

Habdul Hazeez 2024年2月15日
  1. 重现未定义的索引错误
  2. 使用 isset() 检查 $_POST 的内容
  3. 使用 array_key_exists() 搜索 $_POST 中的键
  4. 使用 in_array 检查值是否存在于 $_POST
  5. 使用空合并运算符 (??)
PHP Post 的未定义索引

本文介绍了 PHP $_POST未定义索引 的四种解决方案。解决方案将使用 isset()array_key_exists()in_array() 和 Null 合并运算符。

首先,我们将在解释解决方案之前重现错误。同时,在 PHP 8 中,未定义索引未定义数组键相同。

重现未定义的索引错误

要重现错误,请下载 XAMPPWAMP 并在 htdocs 中创建一个工作目录。在你的工作目录中将以下 HTML 表单保存为 sample-html-form.html

该表单有两个输入字段,它们接受用户的名字和姓氏。你还会注意到我们已将表单的 action 属性设置为 0-reproduce-the-error.php

代码 - 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>

代码 - 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);
    }
?>

现在,在 Web 浏览器中打开 HTML 表单。然后在输入字段中输入空字符串并点击提交按钮。

PHP 5 中,你将获得如下图所示的输出。图片显示 undefined indexPHP 5 中的 Notice

输出:

PHP 5 中的未定义索引

如果你使用 PHP 8未定义索引变成未定义数组键。此外,与 PHP 5 不同,undefined array keyPHP 8 中的 Warning

输出:

PHP 8 中未定义的数组键

接下来是向你展示解决问题的不同方法。

使用 isset() 检查 $_POST 的内容

使用 isset(),你可以在使用其任何内容之前检查 $_POST。首先,设置一个 if...else 语句,在其条件检查中使用 isset()

if 块中的代码应该只在 isset() 返回 true 时执行。通过这样做,你将防止出现未定义索引错误。

在下面的代码中,我们正在检查 HTML 表单的名称属性是否存在于 $_POST 中。此外,我们确保用户没有输入空字符串。

如果检查返回 true,我们打印用户提供的数据。在你的工作目录中将 PHP 代码保存为 1-fix-with-isset.php 并将其与 HTML 表单链接。

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

输出(当用户提供空值时):

提交包含空详细信息的表单

使用 array_key_exists() 搜索 $_POST 中的键

顾名思义,array_key_exists() 将在 $_POST 中搜索一个键。在我们的例子中,这些键是 HTML 表单输入的名称属性。

如果 array_key_exists()$_POST 中找到名称属性,我们将只处理该表单。为了安全起见,我们使用 empty() 函数来确保用户输入了一些数据。

你将在以下代码中找到所有这些。要测试代码,请将其保存为工作目录中的 2-fix-with-array-key-exists.php,并通过更新 action 属性的值将其与 HTML 表单链接。

现在,执行以下步骤。

  1. 在代码编辑器中打开 HTML 文件。
  2. First name 输入的 name 属性更新为 first_nam(我们删除了最后的 e)。
  3. 切换到你的 Web 浏览器并填写名字和姓氏。

当你用正确的数据填写表格时会发生错误。那是因为 first_namfirst_name 之间存在不匹配。

PHP 脚本期望后者,但它得到了前者。如果没有错误检查,你将获得未定义索引未定义数组键

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

输出(注意 DevTools 中突出显示的部分):

填写名称属性不正确的 HTML 表单

使用 in_array 检查值是否存在于 $_POST

PHP in_array() 函数可以搜索 $_POST 以获得特定值。知道了这一点,我们可以用它来确认用户是否填写了 HTML 表单。

empty() 函数一起,我们可以确保用户没有提供空字符串。搜索和空位检查都可以防止未定义索引未定义数组键

在下面详述的示例中,我们使用 in_arrayempty() 来防止 undefined index 错误。将 PHP 代码保存为 3-fix-with-in-array.php,然后将 HTML 的 action 属性设置为 PHP 文件的名称。

打开 HTML 表单,填写 Last name 字段,并将 First name 留空。提交表单,你将收到自定义错误消息,因为 in_array 未在 $_POST 中找到名字。

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

输出:

在 HTML 表单中填写一个输入字段

使用空合并运算符 (??)

空合并运算符 (??) 将返回其左侧的操作数(如果存在)。否则,它将返回右侧的操作数。

有了这些知识,我们可以将输入值传递给 Null 合并运算符。结果,如果该值存在,则运算符将其返回; 否则,我们会让它返回另一个值。

在下面的代码中,我们将检查 Null 合并运算符是否返回了这个其他值。如果是,则表示其中一个表单输入不在 $_POST 中。

有了这个,我们可以显示除未定义索引未定义数组键之外的自定义错误消息。将代码保存为 4-fix-with-null-coalescing-operator.php 并将其与你的 HTML 表单链接。

然后,打开你的网络浏览器并使用正确的数据填写表格。提交表单时不会收到任何错误消息。

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

输出:

正确填写的 HTML 表单

作者: Habdul Hazeez
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