Índice indefinido con PHP Post

Habdul Hazeez 15 febrero 2024
  1. Reproducir el error de índice indefinido
  2. Utilice isset() para comprobar el contenido de $_POST
  3. Utilice array_key_exists() para buscar las claves en $_POST
  4. Utilice in_array para comprobar si existe un valor en $_POST
  5. Usar operador coalescente nulo (??)
Índice indefinido con PHP Post

Este artículo enseña cuatro soluciones para undefined index en PHP $_POST. Las soluciones utilizarán isset(), array_key_exists(), in_array(), y el operador de fusión nulo.

Primero, reproduciremos el error antes de explicar las soluciones. Mientras tanto, en PHP 8, undefined index es lo mismo que undefined array key.

Reproducir el error de índice indefinido

Para reproducir el error, descarga XAMPP o WAMP y crea un directorio de trabajo en htdocs. Guarde el siguiente formulario HTML en su directorio de trabajo como sample-html-form.html.

El formulario tiene dos campos de entrada que aceptan el nombre y apellido de un usuario. También notará que hemos establecido el atributo de acción del formulario en 0-reproduce-the-error.php.

Código - 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>

Código - 0-reproduce-el-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);
    }
?>

Ahora, abra el formulario HTML en su navegador web. Luego escriba cadenas vacías en los campos de entrada y presione el botón Enviar.

En PHP 5, obtendrás una salida como la que se muestra en la siguiente imagen. La imagen muestra que undefined index es un Notice en PHP 5.

Producción:

Índice indefinido en PHP 5

Si usa PHP 8, undefined index se convierte en undefined array key. Además, a diferencia de PHP 5, undefined array key es un Warning en PHP 8.

Producción:

Clave de matriz indefinida en PHP 8

Lo siguiente es mostrarte diferentes formas que lo resolverán.

Utilice isset() para comprobar el contenido de $_POST

Con isset(), puedes comprobar $_POST antes de usar cualquiera de sus contenidos. Primero, configure una declaración if...else que use isset() en su verificación condicional.

El código en el bloque if solo debe ejecutarse si isset() devuelve true. Al hacer esto, evitará el error de undefined index.

En el siguiente código, estamos comprobando si los atributos de nombre del formulario HTML existen en $_POST. Además, nos aseguramos de que el usuario no haya ingresado cadenas vacías.

Si la comprobación devuelve true, imprimimos los datos proporcionados por el usuario. Guarde el código PHP como 1-fix-with-isset.php en su directorio de trabajo y vincúlelo con el formulario HTML.

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

Salida (cuando el usuario proporciona valores vacíos):

Enviar un formulario con detalles vacíos

Utilice array_key_exists() para buscar las claves en $_POST

El array_key_exists() como su nombre lo indica buscará una clave en $_POST. En nuestro caso, estas claves son los atributos de nombre de las entradas del formulario HTML.

Solo procesaremos el formulario si array_key_exists() encuentra los atributos del nombre en $_POST. Para estar seguros, usamos la función empty() para asegurarnos de que el usuario ingrese algunos datos.

Encontrará todo esto en el siguiente código. Para probar el código, guárdelo como 2-fix-with-array-key-exists.php en su directorio de trabajo y vincúlelo con su formulario HTML actualizando el valor del atributo action.

Ahora, haz los siguientes pasos.

  1. Abra el archivo HTML en su editor de código.
  2. Actualice el atributo name de la entrada First name a first_nam (eliminamos la última e).
  3. Cambie a su navegador web y complete el nombre y apellido.

Se producirá un error cuando rellene el formulario con los datos correctos. Eso es porque hay una falta de coincidencia entre first_nam y first_name.

El script PHP esperaba lo último, pero obtuvo lo primero. Sin la comprobación de errores, obtendrá el undefined index o undefined array key.

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

Salida (preste atención a la parte resaltada en DevTools):

Llenar un formulario HTML que tiene atributos de nombre incorrectos

Utilice in_array para comprobar si existe un valor en $_POST

La función PHP in_array() puede buscar $_POST para un valor específico. Sabiendo esto, podemos usarlo para confirmar si el usuario llenó el formulario HTML.

Junto con la función empty(), podemos asegurarnos de que el usuario no proporcionó cadenas vacías. Tanto la búsqueda como la comprobación de vacíos evitan que se produzcan undefined index o undefined array key.

En el ejemplo que se detalla a continuación, usamos in_array y empty() para evitar el error de undefined index. Guarde el código PHP como 3-fix-with-in-array.php, luego configure el atributo action del HTML con el nombre del archivo PHP.

Abra el formulario HTML, complete el campo Last name y deje el First name en blanco. Envíe el formulario y obtendrá el mensaje de error personalizado porque in_array no encontró el primer nombre en $_POST.

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

Producción:

Rellenar un campo de entrada en el formulario HTML

Usar operador coalescente nulo (??)

El operador coalescente nulo (??) devolverá el operando en su lado izquierdo si existe. De lo contrario, devolverá el operando de la derecha.

Armados con este conocimiento, podemos pasar un valor de entrada al operador coalescente nulo. Como resultado, si el valor existe, el operador lo devolverá; de lo contrario, haremos que devuelva otro valor.

En el código a continuación, verificaremos si el operador fusionado nulo devolvió este otro valor. Si es así, eso significa que una de las entradas del formulario no está en $_POST.

Con esto, podemos mostrar un mensaje de error personalizado que no sea undefined index o undefined array key. Guarde el código como 4-fix-with-null-coalescing-operator.php y vincúlelo con su formulario HTML.

Luego, abra su navegador web y complete el formulario con los datos correctos. No recibirá mensajes de error cuando envíe el formulario.

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

Producción:

Un formulario HTML completado correctamente

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