6. Validating the input form
Validaci贸n de Formularios en PHP
馃摎 Tema del Tutorial:
"Validaci贸n de Datos: Protegiendo tu Aplicaci贸n PHP de Entradas Incorrectas"
馃幆 Objetivo de Aprendizaje
Al final de este tutorial entender谩s:
C贸mo validar formularios en el lado del servidor
Qu茅 son las variables superglobales en PHP
C贸mo manejar archivos subidos por usuarios
C贸mo mostrar mensajes de error apropiados
Por qu茅 la validaci贸n es crucial para la seguridad
馃搨 Parte 1: ¿Por qu茅 Validar Formularios?
La Importancia de la Validaci贸n
Imagina tu aplicaci贸n web como un restaurante:
Usuario = Cliente que hace un pedido
Formulario = Men煤 donde el cliente escribe su pedido
Validaci贸n = El chef que revisa si el pedido es posible
Sin validaci贸n:
text
Cliente pide: "Quiero un pastel de luna"
Chef: "Aqu铆 tienes" (pero no tiene ingredientes) ❌
Con validaci贸n:
text
Cliente pide: "Quiero un pastel de luna"
Chef: "Lo siento, solo tenemos pastel de chocolate" ✅
Dos tipos de validaci贸n:
✅ Validaci贸n Frontend (JavaScript):
R谩pida, en el navegador
Mejora experiencia de usuario
NO es segura (se puede desactivar)
✅ Validaci贸n Backend (PHP):
En el servidor
Obligatoria para seguridad
脷ltima l铆nea de defensa
Analog铆a:
text
Frontend = Guardia en la entrada (amable pero evitable)
Backend = Polic铆a dentro del banco (definitiva y segura)
馃攳 Parte 2: Las Variables Superglobales de PHP
¿Qu茅 son las Superglobales?
Son variables especiales de PHP que est谩n SIEMPRE disponibles, como c谩maras de seguridad en tu aplicaci贸n:
text
$_POST → 馃摑 Lo que el usuario ESCRIBE en formularios
$_GET → 馃敆 Lo que viene en la URL (par谩metros)
$_FILES → 馃摛 Archivos que el usuario SUBE
$_SERVER → 馃枼️ Informaci贸n del servidor
$_SESSION → 馃 Memoria temporal del usuario
Enfoque en $_SERVER y $_FILES:
$_SERVER - El "carnet de identidad" de la petici贸n:
php
$_SERVER['REQUEST_METHOD'] = 'POST' // ¿C贸mo vino la petici贸n?
$_SERVER['REMOTE_ADDR'] = '192.168.1.1' // IP del usuario
$_SERVER['HTTP_USER_AGENT'] = 'Chrome' // Navegador usado
$_FILES - El "paquete" de archivos:
php
$_FILES['file']['name'] = 'video.mp4' // Nombre original
$_FILES['file']['type'] = 'video/mp4' // Tipo MIME
$_FILES['file']['size'] = 1024000 // Tama帽o en bytes
$_FILES['file']['tmp_name'] = '/tmp/xyz' // Ubicaci贸n temporal
$_FILES['file']['error'] = 0 // C贸digo de error
馃洜️ Parte 3: Creando init.php - El "Centro de Control"
Paso 1: Crear init.php
Este archivo es como el cuarto de control de tu aplicaci贸n:
php
// backend/init.php
<?php
// Cargar las "herramientas" necesarias
require 'classes/DB.php'; // 馃摝 Herramienta para base de datos
require 'classes/Whisper.php'; // 馃帳 Herramienta para procesar audio
// Crear una instancia de Whisper lista para usar
$whisperObj = new Whisper;
?>
Analog铆a:
text
init.php = Malet铆n de herramientas del fontanero
require = Sacar las herramientas
$whisperObj = Herramienta principal lista para usar
Paso 2: Incluir init.php en index.php
php
// index.php (al inicio del archivo)
<?php
include 'backend/init.php'; // ← ¡Trae todo el cuarto de control!
?>
Esquema visual:
text
馃搫 index.php (p谩gina principal)
│
├── 馃摝 Incluye: backend/init.php
│ │
│ ├── 馃敡 Carga: classes/DB.php
│ │
│ └── 馃帳 Crea: $whisperObj (objeto listo)
│
└── 馃帹 HTML (interfaz visual)
馃殾 Parte 4: Validando el M茅todo de la Petici贸n
Paso 3: Verificar el M茅todo HTTP
Los m茅todos HTTP m谩s comunes:
GET = Pedir informaci贸n (como preguntar "¿Qu茅 hay de comer?")
POST = Enviar informaci贸n (como decir "Quiero una pizza")
C贸digo para verificar:
php
if($_SERVER['REQUEST_METHOD'] === "POST"){
// Esto se ejecuta SOLO si es una petici贸n POST
echo "¡Alguien est谩 enviando datos!";
}
Explicaci贸n detallada:
php
if( // SI
$_SERVER // en la informaci贸n del servidor
['REQUEST_METHOD'] // el m茅todo de petici贸n
=== // ES EXACTAMENTE IGUAL A
"POST" // "POST"
){ // ENTONCES haz lo siguiente...
Diagrama de flujo:
text
[馃摠 Usuario env铆a formulario]
↓
[馃 PHP pregunta: ¿M茅todo = POST?]
│
├── SI → ✅ Procesa los datos
│
└── NO → ⏭️ Salta al HTML (primera visita)
馃搵 Parte 5: Validando que se Subi贸 un Archivo
Paso 4: Verificar si $_FILES est谩 configurado
isset() - El "detector de presencia":
php
if(isset($_FILES['file'])){
// ¡Hay un archivo en la petici贸n!
}
empty() - El "detector de contenido":
php
if(!empty($_FILES['file']['name'][0])){
// ¡Y tiene un nombre! (no est谩 vac铆o)
}
Combinando ambos:
php
if(isset($_FILES['file']) && !empty($_FILES['file']['name'][0])){
// ✅ Archivo presente y con nombre
} else {
// ❌ Error: No hay archivo v谩lido
$error = "Por favor selecciona un archivo para convertir a texto";
}
Analog铆a del correo:
text
isset() = ¿Hay un paquete en la mesa de correos?
empty() = ¿El paquete tiene algo dentro?
Combinado = ¿Hay un paquete NO vac铆o en la mesa?
Paso 5: Obteniendo el Tipo de Archivo
php
$fileType = $_FILES['file']['type'];
// Ejemplo: 'video/mp4', 'audio/mpeg', 'image/png'
Por qu茅 es importante saber el tipo:
Seguridad: Evita que suban archivos maliciosos
Compatibilidad: Asegura que tu aplicaci贸n pueda procesarlo
Base de datos: Guardar informaci贸n correcta
Ejemplo de tipos MIME comunes:
text
馃帴 Video: video/mp4, video/mpeg, video/avi
馃幍 Audio: audio/mpeg, audio/wav, audio/ogg
馃柤️ Imagen: image/jpeg, image/png, image/gif
馃搫 Documento: application/pdf, text/plain
馃毃 Parte 6: Mostrando Mensajes de Error
Paso 6: Estructura de Mensajes de Error
HTML para mostrar errores (en index.php):
html
<!-- ERROR DIV -->
<?php if(isset($error)): ?>
<div class="bg-red-100 border border-red-400 text-red-700 px-4 py-3 rounded relative">
<strong class="font-bold">Error:</strong>
<span class="block sm:inline"><?php echo $error; ?></span>
</div>
<?php endif; ?>
Desglose visual del mensaje de error:
text
馃敶 CONTENEDOR ROJO (bg-red-100)
├── 馃毇 BORDE ROJO (border-red-400)
├── 馃摑 TEXTO ROJO (text-red-700)
├── 馃敔 ENCABEZADO: <strong>Error:</strong>
└── 馃搫 MENSAJE: <?php echo $error; ?>
Paso 7: L贸gica Condicional PHP/HTML
Sintaxis alternativa PHP/HTML:
php
<?php if($condicion): ?>
<!-- HTML a mostrar si la condici贸n es TRUE -->
<?php else: ?>
<!-- HTML a mostrar si la condici贸n es FALSE -->
<?php endif; ?>
Ventajas de esta sintaxis:
M谩s legible cuando hay mucho HTML
Mejor organizaci贸n del c贸digo
F谩cil de entender para principiantes
馃З Parte 7: C贸digo Completo Explicado
C贸digo final de validaci贸n:
php
<?php
include 'backend/init.php'; // 1️⃣ Cargar herramientas
if($_SERVER['REQUEST_METHOD'] === "POST"){ // 2️⃣ ¿Es POST?
if(isset($_FILES['file'])){ // 3️⃣ ¿Hay archivo en la petici贸n?
if(!empty($_FILES['file']['name'][0])){ // 4️⃣ ¿Tiene nombre?
$fileType = $_FILES['file']['type']; // 5️⃣ Obtener tipo
var_dump($fileType); // Mostrar para depurar
// Aqu铆 procesaremos el archivo despu茅s...
} else {
$error = "Por favor selecciona un archivo para convertir a texto";
}
} else {
$error = "Por favor selecciona un archivo para convertir a texto";
}
}
?>
Diagrama de validaci贸n paso a paso:
text
[馃懁 Usuario env铆a formulario]
↓
[1️⃣ ¿REQUEST_METHOD === "POST"?]
↓ SI
[2️⃣ ¿isset($_FILES['file'])?]
↓ SI
[3️⃣ ¿!empty($_FILES['file']['name'][0])?]
│
├── SI → ✅ $fileType = tipo
│ ✅ Continuar procesamiento
│
└── NO → ❌ $error = "Selecciona archivo"
馃敡 Parte 8: Ejercicio Pr谩ctico - Validaci贸n Extendida
Ejercicio 1: Validar Formulario de Contacto
HTML del formulario:
html
<form method="post">
<input type="text" name="nombre" placeholder="Tu nombre">
<input type="email" name="email" placeholder="Tu email">
<textarea name="mensaje" placeholder="Tu mensaje"></textarea>
<button type="submit">Enviar</button>
</form>
PHP de validaci贸n para practicar:
php
<?php
$errores = [];
if($_SERVER['REQUEST_METHOD'] === "POST"){
// Validar nombre
if(empty($_POST['nombre'])){
$errores[] = "El nombre es obligatorio";
} elseif(strlen($_POST['nombre']) < 2){
$errores[] = "El nombre debe tener al menos 2 caracteres";
}
// Validar email
if(empty($_POST['email'])){
$errores[] = "El email es obligatorio";
} elseif(!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)){
$errores[] = "El email no es v谩lido";
}
// Validar mensaje
if(empty($_POST['mensaje'])){
$errores[] = "El mensaje es obligatorio";
}
// Si no hay errores, procesar
if(empty($errores)){
echo "¡Formulario enviado correctamente!";
}
}
?>
Ejercicio 2: Mostrar M煤ltiples Errores
php
<?php if(!empty($errores)): ?>
<div class="errores">
<h3>Errores encontrados:</h3>
<ul>
<?php foreach($errores as $error): ?>
<li><?php echo $error; ?></li>
<?php endforeach; ?>
</ul>
</div>
<?php endif; ?>
馃洝️ Parte 9: Seguridad - ¿Por qu茅 Validar en el Servidor?
Principales Amenazas sin Validaci贸n:
馃摛 Inyecci贸n de Archivos Maliciosos:
Usuario sube archivo .exe con virus
Sin validaci贸n: Se sube y puede infectar
Con validaci贸n: Se rechaza (no es audio/video)
馃捑 Ataques de Desbordamiento:
Usuario sube archivo de 10GB
Sin validaci贸n: Llena el servidor
Con validaci贸n: Se rechaza (l铆mite de tama帽o)
馃攧 Cross-Site Scripting (XSS):
Usuario sube archivo con c贸digo malicioso
Sin validaci贸n: Ejecuta c贸digo peligroso
Con validaci贸n: Sanitiza el contenido
Reglas de Oro para Validaci贸n Segura:
❌ Nunca conf铆es en datos del usuario
✅ Valida TODO en el servidor
馃搹 Establece l铆mites claros (tama帽o, tipo)
馃敀 Sanitiza los datos antes de procesar
馃摑 Registra intentos sospechosos
馃И Parte 10: Depuraci贸n - var_dump() y Desarrollo
Usando var_dump() para Depurar:
¿Qu茅 hace var_dump()?
Muestra informaci贸n detallada de una variable, como una radiograf铆a:
php
$fileType = $_FILES['file']['type'];
var_dump($fileType);
// Salida: string(9) "video/mp4"
Interpretaci贸n:
string = Tipo de dato (cadena de texto)
(9) = Longitud (9 caracteres)
"video/mp4" = Valor real
Otros m茅todos de depuraci贸n:
php
print_r($_FILES); // Muestra array de forma legible
echo $variable; // Muestra valor simple
error_log($mensaje); // Guarda en logs del servidor
馃搳 Parte 11: Esquema Visual del Proceso Completo
text
馃寪 FLUJO COMPLETO DE VALIDACI脫N
[馃懁 USUARIO]
↓ (selecciona archivo + env铆a)
[馃寪 NAVEGADOR]
↓ (env铆a POST + archivo)
[馃枼️ SERVIDOR - index.php]
│
├── 1️⃣ include 'backend/init.php'
│ ↓
│ [馃敡 Carga DB.php + Whisper.php]
│ ↓
│ [馃帳 Crea $whisperObj]
│
├── 2️⃣ if($_SERVER['REQUEST_METHOD'] === "POST")
│ │
│ ├── NO → ⏭️ Salta a HTML
│ │
│ └── SI → 3️⃣ if(isset($_FILES['file']))
│ │
│ ├── NO → 馃毃 $error = "Selecciona archivo"
│ │
│ └── SI → 4️⃣ if(!empty($_FILES['file']['name'][0]))
│ │
│ ├── NO → 馃毃 $error = "Selecciona archivo"
│ │
│ └── SI → ✅ $fileType = tipo
│ ✅ Continuar procesamiento
│
└── 馃帹 Mostrar HTML (con o sin error)
❓ Parte 12: Cuestionario de Evaluaci贸n
Pregunta 1:
¿Cu谩l es la principal raz贸n para validar formularios en PHP (backend) adem谩s de JavaScript?
a) Para que la p谩gina cargue m谩s r谩pido
b) Porque JavaScript puede ser desactivado por el usuario ✅
c) Para usar menos c贸digo
d) Porque PHP es m谩s moderno
Explicaci贸n: La validaci贸n en backend es obligatoria por seguridad, ya que el usuario puede desactivar JavaScript.
Pregunta 2:
¿Qu茅 hace exactamente esta condici贸n en PHP?
php
if($_SERVER['REQUEST_METHOD'] === "POST")
a) Verifica si hoy es d铆a festivo
b) Comprueba si la petici贸n vino por m茅todo POST ✅
c) Valida el tipo de archivo subido
d) Revisa la conexi贸n a internet
Pregunta 3:
¿Cu谩l es la diferencia entre isset() y empty()?
a) isset() verifica si existe, empty() si tiene valor ✅
b) isset() es para n煤meros, empty() para texto
c) isset() es m谩s r谩pido que empty()
d) No hay diferencia, son iguales
Pregunta 4:
¿Qu茅 informaci贸n contiene $_FILES['file']['type']?
a) El tama帽o del archivo en bytes
b) El tipo MIME del archivo (ej: video/mp4) ✅
c) La fecha de creaci贸n del archivo
d) El nombre original del archivo
Pregunta 5:
¿Para qu茅 sirve el archivo init.php en nuestro proyecto?
a) Para almacenar im谩genes del sitio
b) Para cargar configuraciones y crear objetos ✅
c) Para contener los estilos CSS
d) Para validar formularios autom谩ticamente
Pregunta 6:
En esta l铆nea, ¿qu茅 representa [0]?
php
!empty($_FILES['file']['name'][0])
a) El primer car谩cter del nombre
b) El primer archivo si se suben m煤ltiples ✅
c) Un valor por defecto
d) Un 铆ndice de base de datos
Respuesta correcta: b) Cuando se permiten m煤ltiples archivos, [0] es el primero.
Pregunta 7:
¿Por qu茅 es importante validar el tipo MIME de un archivo subido?
a) Para organizarlos alfab茅ticamente
b) Por seguridad y compatibilidad ✅
c) Para reducir el tama帽o del archivo
d) Para cambiarle el nombre autom谩ticamente
馃弳 Resumen Final - Reglas de Validaci贸n
Las 5 Reglas de Oro de la Validaci贸n PHP:
馃敀 Siempre valida en el servidor - JavaScript es solo para experiencia
馃搵 Verifica el m茅todo - Aseg煤rate de recibir POST para formularios
馃摝 Usa isset() y empty() - Primero existe, luego tiene contenido
馃幆 Espec铆fica qu茅 esperas - Define tipos, tama帽os y formatos permitidos
馃毃 Informa claramente - Mensajes de error comprensibles para el usuario
Checklist de Validaci贸n para tu Proyecto:
✅ Archivo init.php creado en backend/
✅ Incluido init.php en index.php
✅ Verificado m茅todo REQUEST_METHOD === "POST"
✅ Comprobado isset($_FILES['file'])
✅ Verificado !empty($_FILES['file']['name'][0])
✅ Obtenido tipo de archivo $fileType
✅ Mensajes de error implementados
✅ Probado con archivo v谩lido
✅ Probado sin archivo (debe mostrar error)
馃殌 Pr贸ximos Pasos y Mejoras
Para tu proyecto actual:
A帽adir validaci贸n de tama帽o m谩ximo
Validar extensiones espec铆ficas (.mp4, .mp3, .wav)
Sanitizar nombres de archivo
Mover archivos a carpeta segura
Ejemplo de validaci贸n mejorada:
php
// Validar tama帽o (m谩ximo 20MB)
if($_FILES['file']['size'] > 20000000){
$error = "El archivo es muy grande (m谩ximo 20MB)";
}
// Validar extensiones permitidas
$extension = strtolower(pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION));
$permitidas = ['mp4', 'mp3', 'wav', 'mpeg'];
if(!in_array($extension, $permitidas)){
$error = "Tipo de archivo no permitido";
}
馃摎 Recursos para Aprender M谩s
Funciones PHP importantes para validaci贸n:
filter_var() - Filtra y valida datos
htmlspecialchars() - Previene XSS
strip_tags() - Elimina etiquetas HTML
preg_match() - Validaci贸n con expresiones regulares
move_uploaded_file() - Mueve archivos subidos de forma segura
Proyectos para practicar:
Formulario de registro con validaci贸n completa
Sistema de subida de im谩genes con miniaturas
Blog con comentarios validados
Carrito de compras con validaci贸n de cantidades
¡Excelente trabajo! 馃帀 Has aprendido la base de la validaci贸n segura en PHP. Recuerda: un formulario sin validaci贸n es como una casa sin puertas. ¡La seguridad primero!
馃挕 Consejo final:
Cuando desarrolles:
Piensa como atacante - ¿C贸mo romper铆a mi formulario?
Prueba casos extremos - Archivos enormes, tipos raros, nombres extra帽os
Registra intentos fallidos - Para mejorar y detectar ataques
Mantente actualizado - La seguridad web evoluciona constantemente
馃敀 ¡Ahora tu formulario es mucho m谩s seguro! En la pr贸xima lecci贸n procesaremos realmente los archivos validados
Comentarios
Publicar un comentario