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:

  1. ✅ Validaci贸n Frontend (JavaScript):

    • R谩pida, en el navegador

    • Mejora experiencia de usuario

    • NO es segura (se puede desactivar)

  2. ✅ 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:

  1. 馃摛 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)

  2. 馃捑 Ataques de Desbordamiento:

    • Usuario sube archivo de 10GB

    • Sin validaci贸n: Llena el servidor

    • Con validaci贸n: Se rechaza (l铆mite de tama帽o)

  3. 馃攧 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:

  1. ❌ Nunca conf铆es en datos del usuario

  2. ✅ Valida TODO en el servidor

  3. 馃搹 Establece l铆mites claros (tama帽o, tipo)

  4. 馃敀 Sanitiza los datos antes de procesar

  5. 馃摑 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:

  1. 馃敀 Siempre valida en el servidor - JavaScript es solo para experiencia

  2. 馃搵 Verifica el m茅todo - Aseg煤rate de recibir POST para formularios

  3. 馃摝 Usa isset() y empty() - Primero existe, luego tiene contenido

  4. 馃幆 Espec铆fica qu茅 esperas - Define tipos, tama帽os y formatos permitidos

  5. 馃毃 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:

  1. A帽adir validaci贸n de tama帽o m谩ximo

  2. Validar extensiones espec铆ficas (.mp4, .mp3, .wav)

  3. Sanitizar nombres de archivo

  4. 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:

  1. Formulario de registro con validaci贸n completa

  2. Sistema de subida de im谩genes con miniaturas

  3. Blog con comentarios validados

  4. 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:

  1. Piensa como atacante - ¿C贸mo romper铆a mi formulario?

  2. Prueba casos extremos - Archivos enormes, tipos raros, nombres extra帽os

  3. Registra intentos fallidos - Para mejorar y detectar ataques

  4. 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

Entradas m谩s populares de este blog

1-7. Transforma tu audio a texto

10. Haz que tu asistente hable

8. NUEVO - Soluci贸n si tu micr贸fono no est谩 captando tu audio