Comprendiendo los superglobales de PHP: $_POST
$_POST es un array superglobal de PHP que recoge los datos enviados en el cuerpo de una solicitud HTTP POST, ideal para formularios y contraseñas.
Los superglobales de PHP son variables integradas que siempre están disponibles en cualquier ámbito de un script — nunca tienes que declararlos con global ni pasarlos como argumentos. Exponen información clave como la entrada del usuario, los detalles del servidor y las variables de entorno. Uno de los más utilizados es $_POST, el array que PHP rellena con los datos enviados en el cuerpo de una solicitud HTTP POST.
Este capítulo explica qué es $_POST, cómo leer valores de él de forma segura, en qué se diferencia de $_GET, y cómo gestionar un formulario real de extremo a extremo. Para un recorrido más amplio por los arrays relacionados, consulta superglobales de PHP.
¿Qué es $_POST?
$_POST es un array asociativo que recoge los datos de formularios enviados con method="post". El navegador coloca cada campo en el cuerpo de la solicitud (no en la URL), y PHP analiza ese cuerpo en $_POST antes de que se ejecute tu script. Las claves son los atributos name de los controles del formulario, y los valores son lo que el usuario introdujo.
Dado que los datos viajan en el cuerpo de la solicitud, $_POST es la elección correcta para cargas útiles sensibles o grandes (contraseñas, texto largo, subida de archivos), para acciones que cambian el estado del servidor, y siempre que no quieras que los valores aparezcan en la URL o en el historial del navegador.
$_POST vs $_GET
Ambos arrays transportan la entrada del usuario, pero se corresponden con diferentes métodos HTTP y tienen distintas ventajas e inconvenientes.
$_POST | $_GET | |
|---|---|---|
| Ubicación de los datos | Cuerpo de la solicitud | Cadena de consulta de la URL (?key=value) |
| Visible en la URL | No | Sí |
| Marcable como favorito / almacenable en caché | No | Sí |
| Uso típico | Inicio de sesión, crear/actualizar, subidas | Búsquedas, filtros, paginación |
| Límite de tamaño | Grande (configurable en el servidor) | Limitado por la longitud de la URL |
Usa POST cuando la solicitud cambia datos o contiene información secreta; usa GET para lecturas seguras y repetibles. Consulta $_GET para el equivalente, o $_REQUEST si necesitas ambos.
Cómo leer un valor
Accede a un valor por el nombre del campo, exactamente como harías con cualquier clave de array:
$username = $_POST['username'];$_POST solo se rellena después de que se envíe un formulario con POST. En la primera carga de la página es un array vacío, por lo que leer una clave inexistente genera una advertencia. Comprueba siempre que la clave existe primero — usa isset() o el operador de fusión de null de PHP 7+ para proporcionar un valor predeterminado:
<?php
// Safe: never errors, falls back to an empty string
$username = $_POST['username'] ?? '';
if ($username === '') {
echo "Username is required.";
} else {
echo "Hello, " . htmlspecialchars($username);
}
?>El operador de fusión de null ?? devuelve el valor del lado derecho siempre que el lado izquierdo no esté definido o sea null, que es exactamente el caso antes de que se envíe el formulario.
Seguridad: nunca confíes en la entrada del usuario
Todo lo que hay en $_POST proviene del cliente y puede ser falsificado. Dos reglas te mantienen seguro:
- Escapa en la salida. Pasa cualquier valor por
htmlspecialchars()antes de imprimirlo en una página para evitar el cross-site scripting (XSS). - Valida y sanea en la entrada. Usa
filter_var()para comprobar formatos (correo electrónico, entero, URL), y utiliza sentencias preparadas para las consultas de base de datos para evitar la inyección SQL — nunca concatenes valores de$_POSTdirectamente en SQL.
<?php
$email = filter_var($_POST['email'] ?? '', FILTER_VALIDATE_EMAIL);
if ($email === false) {
echo "Please enter a valid email address.";
}
?>Ejemplo: un formulario de contacto completo
El formulario siguiente envía tres campos a contact.php usando el método POST. Cada control tiene un name único, que se convierte en su clave en $_POST.
<form action="contact.php" method="post">
<label for="name">Name:</label>
<input type="text" id="name" name="name" />
<label for="email">Email:</label>
<input type="email" id="email" name="email" />
<label for="message">Message:</label>
<textarea id="message" name="message"></textarea>
<input type="submit" value="Submit" />
</form>En contact.php, primero confirma que la solicitud realmente usó POST (para que el mismo archivo también pueda mostrar el formulario vacío), y luego lee, valida y escapa cada valor:
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$name = trim($_POST['name'] ?? '');
$email = filter_var($_POST['email'] ?? '', FILTER_VALIDATE_EMAIL);
$message = trim($_POST['message'] ?? '');
$errors = [];
if ($name === '') { $errors[] = "Name is required."; }
if ($email === false) { $errors[] = "A valid email is required."; }
if ($message === '') { $errors[] = "Message cannot be empty."; }
if (!$errors) {
// Safe to use the data — e.g. send an email or save to the database
echo "Thanks, " . htmlspecialchars($name) . "! Your message was received.";
} else {
foreach ($errors as $error) {
echo htmlspecialchars($error) . "<br>";
}
}
}
?>Comprobar $_SERVER['REQUEST_METHOD'] es la forma estándar de saber si el usuario está viendo el formulario o enviándolo. Para una explicación más detallada, consulta gestión de formularios en PHP y validación de formularios en PHP.
Lectura de valores múltiples
Cuando varios controles comparten un nombre que termina en [] (casillas de verificación, selecciones múltiples), PHP los convierte en un array anidado:
<input type="checkbox" name="colors[]" value="red">
<input type="checkbox" name="colors[]" value="green"><?php
$colors = $_POST['colors'] ?? []; // e.g. ['red', 'green']
foreach ($colors as $color) {
echo htmlspecialchars($color) . "\n";
}
?>Ten en cuenta que una casilla de verificación sin marcar no envía nada — por lo que colors puede estar completamente ausente, y por eso el valor predeterminado ?? [] es importante.
Conclusión
$_POST es el componente principal para recibir datos de formularios enviados en el cuerpo de la solicitud. Leer de él es tan sencillo como indexar un array, pero el código en producción siempre debe protegerse contra claves faltantes con ?? o isset(), validar la entrada con filter_var(), y escapar la salida con htmlspecialchars(). Combinado con sentencias preparadas para cualquier trabajo con bases de datos, estos hábitos te permiten aceptar la entrada del usuario sin exponer tu aplicación a XSS o inyección SQL.