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ícateAcceso 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.
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
Introducción Y Entorno
Instalación Y Primer Programa De Php
Introducción Y Entorno
Tipos De Datos, Variables Y Constantes
Sintaxis
Operadores Y Expresiones
Sintaxis
Estructuras De Control
Sintaxis
Funciones Y Llamada De Funciones
Sintaxis
Cadenas De Texto Y Manipulación
Sintaxis
Manejo De Números
Sintaxis
Manejo De Fechas Y Tiempo
Sintaxis
Manejo De Arrays
Sintaxis
Introducción A La Poo En Php
Programación Orientada A Objetos
Clases Y Objetos
Programación Orientada A Objetos
Constructores Y Destructores
Programación Orientada A Objetos
Herencia
Programación Orientada A Objetos
Encapsulación
Programación Orientada A Objetos
Polimorfismo
Programación Orientada A Objetos
Interfaces
Programación Orientada A Objetos
Traits
Programación Orientada A Objetos
Namespaces
Programación Orientada A Objetos
Autoloading De Clases
Programación Orientada A Objetos
Manejo De Errores Y Excepciones
Programación Orientada A Objetos
Manejo De Archivos
Programación Orientada A Objetos
Patrones De Diseño
Programación Orientada A Objetos
Introducción A Los Formularios En Php
Formularios
Procesamiento De Datos De Formularios
Formularios
Manejo De Archivos En Formularios
Formularios
Redirecciones Y Retroalimentación Al Usuario
Formularios
Formularios Dinámicos Y Separación De Lógica
Formularios
Introducción A La Persistencia En Php
Persistencia
Conexión A Bases De Datos
Persistencia
Consultas Y Operaciones Crud
Persistencia
Gestión De Transacciones
Persistencia
Manejo De Errores Y Excepciones En Base De Datos
Persistencia
Patrones De Acceso A Datos
Persistencia
Concepto De Sesiones En Php
Sesiones Y Cookies
Configuración De Sesiones
Sesiones Y Cookies
Cookies
Sesiones Y Cookies
Manejo Avanzado De Sesiones Y Cookies
Sesiones Y Cookies
Principales Vulnerabilidades En Php
Seguridad
Seguridad En Formularios Y Entrada De Datos
Seguridad
Protección Frente A Inyección Sql
Seguridad
Gestión De Contraseñas Y Cifrado
Seguridad
Seguridad En Sesiones Y Cookies
Seguridad
Configuraciones De Php Para Seguridad
Seguridad
Introducción Al Testing En Php
Testing
Phpunit
Testing
Cobertura De Código En Testing
Testing
Test Doubles (Mocks, Stubs, Fakes, Spies)
Testing
Pruebas De Integración Y Funcionales
Testing
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
yfilter_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.