PHP

PHP

Tutorial PHP: Procesamiento de datos de formularios

PHP: Aprende a gestionar datos de formularios con GET, POST & REQUEST y cómo implementar validaciones y sanitización para aplicaciones seguras.

Aprende PHP GRATIS y certifícate

Acceso a los datos con $_GET, $_POST y $_REQUEST

En PHP, el acceso a los datos enviados desde formularios HTML se realiza a través de las variables superglobales $_GET, $_POST y $_REQUEST. Estas variables son arrays asociativos que almacenan los datos enviados y están disponibles en cualquier parte del script.

La superglobal $_GET contiene los datos enviados mediante el método GET. Este método envía los datos adjuntándolos a la URL, lo que los hace visibles y limita su tamaño. Para acceder a un valor enviado por GET, se utiliza el nombre del campo como clave en el array. Por ejemplo:

<?php
$usuario = $_GET['usuario'];
echo "Usuario: $usuario\n";

La superglobal $_POST almacena los datos enviados mediante el método POST. A diferencia de GET, los datos no se muestran en la URL y no tienen una limitación estricta de tamaño, lo que permite enviar información más extensa y sensible. Para acceder a estos datos:

<?php
$contraseña = $_POST['contraseña'];
echo "Contraseña: $contraseña\n";

La superglobal $_REQUEST es una combinación de $_GET, $_POST y $_COOKIE. Contiene todos los datos de las tres superglobales, permitiendo acceder a los valores sin importar el método de envío. Aunque puede parecer conveniente, su uso no es recomendable por motivos de seguridad y claridad en el código. Es preferible especificar el origen de los datos:

<?php
$valor = $_REQUEST['valor'];
echo "Valor: $valor\n";

Es importante tener en cuenta el método de envío al procesar un formulario. Para verificar el método utilizado en la petición, se puede consultar la variable $_SERVER['REQUEST_METHOD']:

<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // Procesar datos enviados por POST
    $nombre = $_POST['nombre'];
    echo "Nombre: $nombre\n";
} else {
    // Procesar datos enviados por GET
    $nombre = $_GET['nombre'];
    echo "Nombre: $nombre\n";
}

Al acceder a los datos del formulario, siempre se debe considerar la validación y sanitización de la información recibida para prevenir posibles vulnerabilidades de seguridad, como inyecciones de código o ataques XSS.

Utilizar las superglobales adecuadas y manejar correctamente los datos recibidos es fundamental para desarrollar aplicaciones web seguras y eficientes en PHP.

Sanitización y validación de datos (filtros de PHP: filter_var, filter_input, etc.)

La sanitización y validación de datos son pasos esenciales para proteger una aplicación web de posibles vulnerabilidades y asegurar que los datos procesados sean correctos y seguros. PHP proporciona una serie de filtros a través de las funciones filter_var y filter_input que facilitan estas tareas.

La función filter_var aplica un filtro específico a una variable, permitiendo tanto sanitizar como validar el valor. Por ejemplo, para validar si una cadena es un correo electrónico válido:

<?php
$email = $_POST['email'];

if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
    echo "Correo electrónico válido.\n";
} else {
    echo "Correo electrónico no válido.\n";
}

En este caso, FILTER_VALIDATE_EMAIL es un filtro que verifica si el formato de la cadena es un correo electrónico correcto. La función devuelve el valor filtrado o false si la validación falla.

Por otro lado, para sanitizar una cadena y eliminar caracteres no deseados, se puede utilizar FILTER_SANITIZE_SPECIAL_CHARS:

<?php
$nombre = $_POST['nombre'];
$nombre_sanitizado = filter_var($nombre, FILTER_SANITIZE_SPECIAL_CHARS);
echo "Nombre: $nombre_sanitizado\n";

Este filtro convierte caracteres especiales en entidades HTML, evitando así ataques de inyección de código o XSS.

La función filter_input es similar a filter_var, pero está diseñada para trabajar directamente con fuentes de entrada como INPUT_GET, INPUT_POST, INPUT_COOKIE, etc. Por ejemplo, para obtener y validar un número entero enviado por GET:

<?php
$edad = filter_input(INPUT_GET, 'edad', FILTER_VALIDATE_INT);

if ($edad !== false) {
    echo "Edad válida: $edad\n";
} else {
    echo "Edad no válida.\n";
}

En este caso, FILTER_VALIDATE_INT verifica que el valor sea un entero válido. Si la validación falla, la función devuelve false.

Para aplicar opciones y flags adicionales, se puede pasar un array asociativo con las opciones al filtro. Por ejemplo, para definir un rango específico de valores:

<?php
$edad = filter_input(INPUT_POST, 'edad', FILTER_VALIDATE_INT, [
    'options' => [
        'min_range' => 18,
        'max_range' => 99
    ]
]);

if ($edad !== false) {
    echo "Edad en rango válido: $edad\n";
} else {
    echo "Edad fuera de rango o no válida.\n";
}

Esta configuración asegura que la edad esté entre 18 y 99 años.

Para validar URLs, se utiliza el filtro FILTER_VALIDATE_URL:

<?php
$website = $_POST['website'];

if (filter_var($website, FILTER_VALIDATE_URL)) {
    echo "URL válida.\n";
} else {
    echo "URL no válida.\n";
}

La sanitización de una URL eliminaría caracteres no permitidos utilizando FILTER_SANITIZE_URL:

<?php
$website = $_POST['website'];
$website_sanitizado = filter_var($website, FILTER_SANITIZE_URL);
echo "URL sanitizada: $website_sanitizado\n";

Es importante distinguir entre sanitización y validación: la sanitización limpia los datos eliminando o modificando caracteres no deseados, mientras que la validación comprueba si los datos cumplen con un formato o rango específico.

Para procesar múltiples campos, se puede utilizar filter_input_array y filter_var_array, que permiten aplicar filtros a arrays completos:

<?php
$filtros = [
    'nombre'   => FILTER_SANITIZE_SPECIAL_CHARS,
    'email'    => FILTER_VALIDATE_EMAIL,
    'edad'     => [
        'filter' => FILTER_VALIDATE_INT,
        'options' => [
            'min_range' => 18,
            'max_range' => 99
        ]
    ]
];

$datos = filter_input_array(INPUT_POST, $filtros);

if ($datos['nombre'] && $datos['email'] && $datos['edad'] !== false) {
    echo "Todos los datos son válidos.\n";
} else {
    echo "Algunos datos no son válidos.\n";
}

Esta técnica permite una gestión más organizada y eficiente de la validación y sanitización de múltiples entradas.

La implementación adecuada de estos filtros es fundamental para prevenir ataques comunes en aplicaciones web, como la inyección de SQL, Cross-Site Scripting (XSS) y otros tipos de vulnerabilidades relacionadas con la entrada de datos del usuario.

Validaciones personalizadas y manejo de errores de usuario

Además de los filtros integrados de PHP, es frecuente necesitar validaciones personalizadas para asegurarnos de que los datos cumplen con requisitos específicos de nuestra aplicación. Implementar estas validaciones y gestionar adecuadamente los errores de usuario es esencial para ofrecer una experiencia confiable y segura.

Para crear una validación personalizada, se puede definir una función que verifique las condiciones necesarias. Por ejemplo, supongamos que requerimos validar un nombre de usuario que cumpla las siguientes reglas:

  • Contener solo letras minúsculas y números.
  • Tener entre 5 y 12 caracteres.
  • No comenzar con un número.

La función de validación podría ser:

<?php
function validarNombreUsuario($nombreUsuario)
{
    if (preg_match('/^[a-z][a-z0-9]{4,11}$/', $nombreUsuario)) {
        return true;
    } else {
        return false;
    }
}

En este ejemplo, utilizamos una expresión regular para definir el patrón que debe cumplir el nombre de usuario. Al procesar el formulario, aplicamos esta función y manejamos los errores de manera informativa:

<?php
$nombreUsuario = $_POST['nombre_usuario'] ?? '';

if (validarNombreUsuario($nombreUsuario)) {
    echo "Nombre de usuario válido.\n";
} else {
    echo "Error: El nombre de usuario debe comenzar con una letra, contener solo letras minúsculas y números, y tener entre 5 y 12 caracteres.\n";
}

Es importante proporcionar mensajes de error claros que indiquen al usuario cómo corregir la información ingresada. Para gestionar múltiples errores, podemos utilizar un array de errores:

<?php
$errores = [];

$nombreUsuario = $_POST['nombre_usuario'] ?? '';

if (empty($nombreUsuario)) {
    $errores[] = "El nombre de usuario es obligatorio.";
} elseif (!validarNombreUsuario($nombreUsuario)) {
    $errores[] = "El nombre de usuario no cumple con los requisitos.";
}

if (count($errores) === 0) {
    echo "Datos validados correctamente.\n";
    // Procesar datos
} else {
    foreach ($errores as $error) {
        echo "Error: $error\n";
    }
}

Al utilizar este enfoque, el usuario recibe retroalimentación sobre todos los campos que necesitan corrección, mejorando la usabilidad del formulario.

Para validar otros campos de forma personalizada, podemos crear funciones específicas. Por ejemplo, validar una contraseña segura:

  • Mínimo 8 caracteres.
  • Al menos una letra mayúscula y una minúscula.
  • Al menos un número.
  • Al menos un carácter especial.

La función sería:

<?php
function validarContraseña($contraseña)
{
    if (preg_match('/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[\W_]).{8,}$/', $contraseña)) {
        return true;
    } else {
        return false;
    }
}

Al aplicar esta validación, informamos al usuario si su contraseña cumple con los criterios de seguridad:

<?php
$contraseña = $_POST['contraseña'] ?? '';

if (validarContraseña($contraseña)) {
    echo "Contraseña válida.\n";
} else {
    echo "Error: La contraseña debe tener al menos 8 caracteres, incluir una letra mayúscula, una minúscula, un número y un carácter especial.\n";
}

Para un manejo más estructurado de las validaciones y errores, es recomendable encapsular la lógica en una clase de validación:

<?php
class ValidadorFormulario
{
    private $datos;
    private $errores = [];

    public function __construct($datos)
    {
        $this->datos = $datos;
    }

    public function validarCampoTexto($campo, $min, $max)
    {
        $valor = trim($this->datos[$campo] ?? '');
        if (strlen($valor) < $min || strlen($valor) > $max) {
            $this->errores[$campo] = "El campo $campo debe tener entre $min y $max caracteres.";
        }
    }

    public function validarEmail($campo)
    {
        $valor = $this->datos[$campo] ?? '';
        if (!filter_var($valor, FILTER_VALIDATE_EMAIL)) {
            $this->errores[$campo] = "El campo $campo debe ser un email válido.";
        }
    }

    public function validarPersonalizado($campo, $funcionValidacion, $mensajeError)
    {
        $valor = $this->datos[$campo] ?? '';
        if (!$funcionValidacion($valor)) {
            $this->errores[$campo] = $mensajeError;
        }
    }

    public function obtenerErrores()
    {
        return $this->errores;
    }

    public function esValido()
    {
        return count($this->errores) === 0;
    }
}

En el procesamiento del formulario, utilizamos esta clase:

<?php
$validador = new ValidadorFormulario($_POST);

$validador->validarCampoTexto('nombre', 2, 30);
$validador->validarEmail('email');
$validador->validarPersonalizado('contraseña', 'validarContraseña', "La contraseña no cumple con los requisitos.");

if ($validador->esValido()) {
    echo "Formulario validado correctamente.\n";
    // Procesar datos
} else {
    foreach ($validador->obtenerErrores() as $campo => $error) {
        echo "Error en $campo: $error\n";
    }
}

De esta manera, facilitamos la gestión centralizada de errores y mantenemos el código más limpio y mantenible.

Es esencial también considerar la persistencia de datos en el formulario para evitar que el usuario tenga que volver a introducir información ya proporcionada. Esto se logra mostrando los valores ingresados:

<form action="procesar_formulario.php" method="post">
    <label for="nombre">Nombre:</label>
    <input type="text" name="nombre" value="<?php echo htmlspecialchars($_POST['nombre'] ?? ''); ?>">
    
    <label for="email">Email:</label>
    <input type="email" name="email" value="<?php echo htmlspecialchars($_POST['email'] ?? ''); ?>">
    
    <label for="contraseña">Contraseña:</label>
    <input type="password" name="contraseña">
    
    <input type="submit" value="Enviar">
</form>

El uso de htmlspecialchars en los valores previene problemas de seguridad y asegura que los caracteres especiales se muestren correctamente.

Para el manejo de errores de servidor, como excepciones durante el procesamiento, se deben utilizar bloques try-catch y registrar los errores adecuadamente:

<?php
try {
    // Operaciones que pueden generar excepciones
    procesarDatos($datos);
    echo "Proceso completado con éxito.\n";
} catch (Exception $e) {
    error_log($e->getMessage());
    echo "Error: Ha ocurrido un problema al procesar su solicitud.\n";
}

Es recomendable no mostrar detalles técnicos al usuario final, sino registrar los errores en un log y mostrar mensajes genéricos que no comprometan la seguridad.

Finalmente, para mejorar la interacción, podemos implementar un sistema de mensajes de sesión que informe al usuario sobre el estado de su acción:

<?php
session_start();

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // Validar y procesar datos
    if ($validador->esValido()) {
        $_SESSION['mensaje_exito'] = "Sus datos han sido enviados correctamente.";
        header('Location: formulario.php');
        exit();
    } else {
        $_SESSION['errores'] = $validador->obtenerErrores();
        header('Location: formulario.php');
        exit();
    }
}

Al cargar la página del formulario, mostramos los mensajes almacenados en la sesión:

<?php
session_start();

if (isset($_SESSION['mensaje_exito'])) {
    echo $_SESSION['mensaje_exito'] . "\n";
    unset($_SESSION['mensaje_exito']);
}

if (isset($_SESSION['errores'])) {
    foreach ($_SESSION['errores'] as $campo => $error) {
        echo "Error en $campo: $error\n";
    }
    unset($_SESSION['errores']);
}

Con esta estrategia, el usuario recibe retroalimentación inmediata, lo que mejora la usabilidad y confianza en la aplicación.

Para seguir leyendo hazte Plus

¿Ya eres Plus? Accede a la app

20 % DE DESCUENTO

Plan mensual

19.00 /mes

15.20 € /mes

Precio normal mensual: 19 €
58 % DE DESCUENTO

Plan anual

10.00 /mes

8.00 € /mes

Ahorras 132 € al año
Precio normal anual: 120 €
Aprende PHP GRATIS online

Todas las lecciones de PHP

Accede a todas las lecciones de PHP y aprende con ejemplos prácticos de código y ejercicios de programación con IDE web sin instalar nada.

Introducción A Php

PHP

Introducción Y Entorno

Instalación Y Primer Programa De Php

PHP

Introducción Y Entorno

Tipos De Datos, Variables Y Constantes

PHP

Sintaxis

Operadores Y Expresiones

PHP

Sintaxis

Estructuras De Control

PHP

Sintaxis

Funciones Y Llamada De Funciones

PHP

Sintaxis

Cadenas De Texto Y Manipulación

PHP

Sintaxis

Manejo De Números

PHP

Sintaxis

Manejo De Fechas Y Tiempo

PHP

Sintaxis

Manejo De Arrays

PHP

Sintaxis

Introducción A La Poo En Php

PHP

Programación Orientada A Objetos

Clases Y Objetos

PHP

Programación Orientada A Objetos

Constructores Y Destructores

PHP

Programación Orientada A Objetos

Herencia

PHP

Programación Orientada A Objetos

Encapsulación

PHP

Programación Orientada A Objetos

Polimorfismo

PHP

Programación Orientada A Objetos

Interfaces

PHP

Programación Orientada A Objetos

Traits

PHP

Programación Orientada A Objetos

Namespaces

PHP

Programación Orientada A Objetos

Autoloading De Clases

PHP

Programación Orientada A Objetos

Manejo De Errores Y Excepciones

PHP

Programación Orientada A Objetos

Manejo De Archivos

PHP

Programación Orientada A Objetos

Patrones De Diseño

PHP

Programación Orientada A Objetos

Introducción A Los Formularios En Php

PHP

Formularios

Procesamiento De Datos De Formularios

PHP

Formularios

Manejo De Archivos En Formularios

PHP

Formularios

Redirecciones Y Retroalimentación Al Usuario

PHP

Formularios

Formularios Dinámicos Y Separación De Lógica

PHP

Formularios

Introducción A La Persistencia En Php

PHP

Persistencia

Conexión A Bases De Datos

PHP

Persistencia

Consultas Y Operaciones Crud

PHP

Persistencia

Gestión De Transacciones

PHP

Persistencia

Manejo De Errores Y Excepciones En Base De Datos

PHP

Persistencia

Patrones De Acceso A Datos

PHP

Persistencia

Concepto De Sesiones En Php

PHP

Sesiones Y Cookies

Configuración De Sesiones

PHP

Sesiones Y Cookies

Cookies

PHP

Sesiones Y Cookies

Manejo Avanzado De Sesiones Y Cookies

PHP

Sesiones Y Cookies

Principales Vulnerabilidades En Php

PHP

Seguridad

Seguridad En Formularios Y Entrada De Datos

PHP

Seguridad

Protección Frente A Inyección Sql

PHP

Seguridad

Gestión De Contraseñas Y Cifrado

PHP

Seguridad

Seguridad En Sesiones Y Cookies

PHP

Seguridad

Configuraciones De Php Para Seguridad

PHP

Seguridad

Introducción Al Testing En Php

PHP

Testing

Phpunit

PHP

Testing

Cobertura De Código En Testing

PHP

Testing

Test Doubles (Mocks, Stubs, Fakes, Spies)

PHP

Testing

Pruebas De Integración Y Funcionales

PHP

Testing

Accede GRATIS a PHP y certifícate

En esta lección

Objetivos de aprendizaje de esta lección

  • Comprender el uso de $_GET, $_POST y $_REQUEST para manipular datos del formulario.
  • Aplicar técnicas de validación y sanitización de datos en PHP.
  • Utilizar filtros como filter_var y filter_input para asegurar entradas.
  • Implementar validaciones personalizadas mediante expresiones regulares.
  • Gestionar errores de usuario y retroalimentación en formularios.
  • Desarrollar clases de validación para una estructura más organizada.