Envío de datos entre páginas con PHP (GET y POST)

En PHP, la forma más común de enviar información desde el navegador al servidor es mediante los métodos GET y POST. Este manual resume qué son, cuándo usarlos y muestra ejemplos prácticos para formularios y enlaces.

Idea clave: GET envía datos en la URL (visibles), POST los envía en el cuerpo del mensaje (no visibles en la URL).

Índice

¿Qué es GET y POST?

Tabla comparativa

Aspecto GET POST
Visibilidad Parámetros visibles en la URL Datos no visibles en la URL (viajan en el cuerpo)
Uso típico Filtros, búsquedas, navegación, enlaces compartibles Formularios con datos sensibles, creación/actualización de registros
Límite práctico Limitado por longitud de URL del navegador/servidor Permite mayor volumen de datos
Cacheable por defecto Suele ser cacheable y bookmarkeable No es cacheable ni bookmarkeable por defecto
Idempotencia Debería ser seguro (no cambia estado del servidor) Usado para operaciones que modifican estado

Ejemplo con GET

Escenario: Enlaces con parámetros para filtrar por usuario y edad.

<!-- Enlaces (del lado del cliente) -->
<a href="perfil.php?usuario=Pablo&edad=30">Ver perfil de Pablo</a>
<a href="perfil.php?usuario=Ana&edad=25">Ver perfil de Ana</a>

<!-- perfil.php (del lado del servidor) -->
<?php
$usuario = $_GET['usuario'] ?? null;
$edad    = $_GET['edad']    ?? null;

if ($usuario && $edad) {
  echo "Usuario: " . htmlspecialchars($usuario, ENT_QUOTES, 'UTF-8') . "\n";
  echo "Edad: " . (int)$edad;
} else {
  echo "Faltan parámetros en la URL.";
}
?>

Ejemplo con POST

Escenario: Formulario de login (usuario/clave) que envía datos al servidor por POST.

<!-- login.html (cliente) -->
<form action="login.php" method="post">
  <label>Usuario:</label>
  <input type="text" name="usuario" required>

  <label>Contraseña:</label>
  <input type="password" name="clave" required>

  <button type="submit">Ingresar</button>
</form>

<!-- login.php (servidor) -->
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
  $usuario = trim($_POST['usuario'] ?? '');
  $clave   = $_POST['clave'] ?? '';

  if ($usuario === '' || $clave === '') {
    echo "Datos incompletos.";
    exit;
  }

  // Aquí validarías contra la BD usando password_hash/password_verify
  echo "Login recibido para: " . htmlspecialchars($usuario, ENT_QUOTES, 'UTF-8');
} else {
  echo "Acceso inválido (use POST).";
}
?>

Buenas prácticas y seguridad

Patrón PRG (Post/Redirect/Get)

Tras procesar un formulario por POST, es buena práctica redirigir a una página por GET para evitar reenvíos al actualizar:

<?php
// procesar.php
session_start();

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
  // ... procesar y validar ...
  $_SESSION['flash'] = "Operación exitosa";

  // Redirigir (PRG) para que F5 no reenvíe el POST
  header("Location: resultado.php");
  exit;
}
?>
Resumen: Usá GET para lectura/navegación y POST para envíos que cambian estado. Validá y protegé tus formularios, y aplicá PRG para una mejor UX.