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.
¿Te está gustando esta lección?
Inicia sesión para no perder tu progreso y accede a miles de tutoriales, ejercicios prácticos y nuestro asistente de IA.
Más de 25.000 desarrolladores ya confían en CertiDevs
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.
Aprendizajes 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.
Completa PHP y certifícate
Únete a nuestra plataforma y accede a miles de tutoriales, ejercicios prácticos, proyectos reales y nuestro asistente de IA personalizado para acelerar tu aprendizaje.
Asistente IA
Resuelve dudas al instante
Ejercicios
Practica con proyectos reales
Certificados
Valida tus conocimientos
Más de 25.000 desarrolladores ya se han certificado con CertiDevs