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 y method

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:

GETPOST
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);
XSS — la vulnerabilidad más común

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.

Probá el Ejemplo 3: Sanitización

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