Lección 8: Formularios 2

Una de las tareas más laboriosas es validar una información que llega de un formulario. Es peligroso meter cualquier cosa que llegue a nuestra Base de Datos. El usuario es torpe o malintencionado.

  • Introducir e-mails sin sentidos.
  • Letras en lugar de números (por ejemplo al pedir la edad).
  • Dejar campos vacíos cuando deben ser obligatorios.
  • Dar malos formatos. (por ejemplo en un número de teléfono).
  • Una longitud muy corta o muy larga de un texto.
  • Código mal intencionado.
  • Y largo etcétera.

No existe una única manera de validar, cada programador tiene su método. Pero lo que siempre hay que realizar son unos pasos estrictos:

  1. Enviar datos desde nuestro formulario.
  2. Recoger los datos.
  3. Validar cada campo.
  4. Mostrar al usuario los errores con un mensaje.
  5. Si existen errores, mantenerse en la página.
  6. Si no existen errores, generar la acción que busques e informar al usuario del éxito.

Aunque valides en Javascript (Front-End) debemos validar con PHP (Back-End). Los datos pueden ser alterados desde el navegador. ¡Nunca te fíes del usuario!

Ejemplo completo

Usando tipos de filtros se ha validado cada campo y se informa al usuario en caso de encontrarse cualquier problema.

<html>
    <body>
        <?php
            //======================================================================
            // PROCESAR FORMULARIO 
            //======================================================================
            // Comprobamos si nos llega los datos por POST
            if ($_SERVER['REQUEST_METHOD'] == 'POST') {
                //-----------------------------------------------------
                // Funciones Para Validar
                //-----------------------------------------------------

                /**
                 * Método que valida si un texto no esta vacío
                 * @param {string} - Texto a validar
                 * @return {boolean}
                 */
                function validar_requerido(string $texto): bool
                {
                    return !(trim($texto) == '');
                }

                /**
                 * Método que valida si es un número entero 
                 * @param {string} - Número a validar
                 * @return {bool}
                 */
                function validar_entero(string $numero): bool
                {
                    return (filter_var($numero, FILTER_VALIDATE_INT) === FALSE) ? False : True;
                }

                /**
                 * Método que valida si el texto tiene un formato válido de E-Mail
                 * @param {string} - Email
                 * @return {bool}
                 */
                function validar_email(string $texto): bool
                {
                    return (filter_var($texto, FILTER_VALIDATE_EMAIL) === FALSE) ? False : True;
                }

                //-----------------------------------------------------
                // Variables
                //-----------------------------------------------------
                $errores = [];
                $nombre = isset($_REQUEST['nombre']) ? $_REQUEST['nombre'] : null;
                $edad = isset($_REQUEST['edad']) ? $_REQUEST['edad'] : null;
                $email = isset($_REQUEST['email']) ? $_REQUEST['email'] : null;

                //-----------------------------------------------------
                // Validaciones
                //-----------------------------------------------------
                // Nombre
                if (!validar_requerido($nombre)) {
                    $errores[] = 'El campo Nombre es obligatorio.';
                }
                // Edad
                if (!validar_entero($edad)) {
                    $errores[] = 'El campo de Edad debe ser un número.';
                }
                // Email
                if (!validar_email($email)) {
                    $errores[] = 'El campo de Email tiene un formato no válido.';
                }
            }
        ?>
        <!-- Mostramos errores por HTML -->
        <?php if (isset($errores)): ?>
        <ul class="errores">
            <?php 
                foreach ($errores as $error) {
                    echo '<li>' . $error . '</li>';
                } 
            ?> 
        </ul>
        <?php endif; ?>
        <!-- Formulario -->
        <form method="post">
            <p>
                <!-- Campo nombre -->
                <input type="text" name="nombre" placeholder="Nombre">
            </p>
            <p>
                <!-- Campo edad -->
                <input type="text" name="edad" placeholder="Edad">
            </p>
            <p>
                <!-- Campo Email -->
                <input type="text" name="email" placeholder="Email">
            </p>
            <p>
                <!-- Botón submit -->
                <input type="submit" value="Enviar">
            </p>
        </form>
    </body>
</html>

6-1 6-2