Formularios en PHP
Los formularios HTML permiten al usuario enviar datos al servidor. PHP los recibe a través de las superglobales $_GET y $_POST y los procesa. Es la base de cualquier aplicación web interactiva.
Cómo funcionan los formularios
El flujo básico es siempre el mismo: el navegador muestra un formulario HTML, el usuario lo completa, lo envía, y PHP recibe los datos en el servidor.
<!-- El formulario HTML -->
<form action="procesar.php" method="POST">
<input type="text" name="nombre">
<input type="submit" value="Enviar">
</form>
// En procesar.php — PHP recibe los datos
$nombre = $_POST["nombre"];
echo "Hola, $nombre";
El atributo name del input es la clave con la que PHP identifica cada dato.
Si el input tiene name="nombre", PHP lo recibe como $_POST["nombre"].
action indica a qué archivo PHP se envían los datos. Si no lo ponés, se envían al mismo archivo. method indica si se usa GET o POST — veremos la diferencia a continuación.
GET vs POST
Son los dos métodos HTTP para enviar datos. Tienen usos diferentes y es importante elegir el correcto:
| GET | POST | |
|---|---|---|
| Dónde van los datos | En la URL: ?nombre=Ana&edad=28 |
En el cuerpo de la petición, no visibles |
| Límite de datos | ~2000 caracteres | Sin límite práctico |
| Se puede marcar como favorito | Sí — la URL contiene todo | No |
| Para qué se usa | Búsquedas, filtros, navegación | Login, registro, envío de datos sensibles |
| Superglobal PHP | $_GET |
$_POST |
GET — datos en la URL
// URL: pagina.php?categoria=php&nivel=basico
$categoria = $_GET["categoria"] ?? "todas";
$nivel = $_GET["nivel"] ?? "todos";
echo "Mostrando: $categoria — Nivel: $nivel";
POST — datos ocultos
// El formulario envió nombre y email por POST
$nombre = $_POST["nombre"] ?? "";
$email = $_POST["email"] ?? "";
echo "Registrando a: $nombre ($email)";
Probá el Ejemplo 1: Leer datos GET
Validar datos del formulario
Nunca confíes en los datos que envía el usuario. Siempre verificá que los datos llegaron, que tienen el formato correcto y que son seguros antes de usarlos.
Verificar que el formulario fue enviado
if ($_SERVER["REQUEST_METHOD"] === "POST") {
// El formulario fue enviado — procesamos
$nombre = $_POST["nombre"] ?? "";
} else {
// Primera carga — mostramos el formulario vacío
$nombre = "";
}
Validaciones básicas
$errores = [];
$nombre = trim($_POST["nombre"] ?? "");
$email = trim($_POST["email"] ?? "");
$edad = (int)($_POST["edad"] ?? 0);
// Validar que no estén vacíos
if (empty($nombre)) {
$errores[] = "El nombre es obligatorio";
}
// Validar longitud
if (strlen($nombre) < 2) {
$errores[] = "El nombre debe tener al menos 2 caracteres";
}
// Validar formato de email
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$errores[] = "El email no es válido";
}
// Validar rango numérico
if ($edad < 18 || $edad > 120) {
$errores[] = "La edad debe estar entre 18 y 120";
}
if (empty($errores)) {
echo "Datos válidos — procesando...";
} else {
foreach ($errores as $error) {
echo "❌ $error <br>";
}
}
Probá el Ejemplo 2: Validaciones
Sanitizar — limpiar los datos
Además de validar, hay que sanitizar: limpiar los datos para eliminar caracteres peligrosos antes de mostrarlos o guardarlos.
// trim() — elimina espacios al principio y al final
$nombre = trim($_POST["nombre"] ?? "");
// htmlspecialchars() — convierte caracteres HTML especiales en entidades
// Esto previene XSS (Cross-Site Scripting)
// Un atacante podría enviar: <script>alert('hackeado')</script>
// htmlspecialchars lo convierte en texto inofensivo
$nombre_seguro = htmlspecialchars($nombre, ENT_QUOTES, "UTF-8");
echo "Hola, $nombre_seguro";
// strip_tags() — elimina todas las etiquetas HTML
$comentario = strip_tags($_POST["comentario"] ?? "");
// Convertir a tipos específicos para números
$cantidad = (int)($_POST["cantidad"] ?? 0);
$precio = (float)($_POST["precio"] ?? 0.0);
Si mostrás directamente lo que envía el usuario sin sanitizar, un atacante puede inyectar JavaScript malicioso en tu página. Siempre usá htmlspecialchars() antes de mostrar datos de usuarios en HTML.
Formulario que se procesa a sí mismo
Un patrón muy común es que el formulario y el código PHP que lo procesa estén en el mismo archivo. Así el usuario ve el resultado en la misma página.
<?php
$resultado = "";
$errores = [];
if ($_SERVER["REQUEST_METHOD"] === "POST") {
$nombre = trim($_POST["nombre"] ?? "");
$email = trim($_POST["email"] ?? "");
if (empty($nombre)) $errores[] = "Nombre obligatorio";
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) $errores[] = "Email inválido";
if (empty($errores)) {
$nombre = htmlspecialchars($nombre, ENT_QUOTES, "UTF-8");
$resultado = "Registrado: $nombre ($email)";
}
}
?>
<!-- Si hubo errores, los mostramos -->
<?php foreach ($errores as $e): ?>
<p style="color:red"><?= $e ?></p>
<?php endforeach; ?>
<!-- Si todo estuvo bien, mostramos el resultado -->
<?php if ($resultado): ?>
<p style="color:green"><?= $resultado ?></p>
<?php endif; ?>
<form method="POST">
<input type="text" name="nombre" placeholder="Tu nombre">
<input type="email" name="email" placeholder="Tu email">
<button type="submit">Registrarse</button>
</form>
Probá el Ejemplo 4: Formulario completo
Buenas Prácticas
- Usá POST para datos sensibles — contraseñas, datos personales, operaciones que modifican datos; nunca GET
- Siempre ?? para leer superglobales —
$_POST["campo"] ?? ""evita errores si el campo no llegó - trim() antes de validar — los espacios al principio o final pueden hacer fallar validaciones innecesariamente
- htmlspecialchars() antes de mostrar — siempre, sin excepción, para cualquier dato que venga del usuario
- Validá en el servidor, no solo en el cliente — la validación JavaScript se puede saltar; la de PHP no
- Nunca insertés datos sin sanitizar en la base de datos — usá siempre prepared statements con PDO para prevenir SQL injection