filter_has_var()
Aprende a usar filter_has_var() en PHP: sintaxis, constantes de fuente de entrada, diferencias con isset() y casos de uso habituales.
filter_has_var() comprueba si una variable de una fuente de entrada específica (GET, POST, cookies, el servidor o el entorno) existe. Esta página cubre su sintaxis, las constantes de fuente de entrada, cómo difiere de isset() y los errores más comunes que suelen cometerse.
Qué hace filter_has_var()
filter_has_var() responde a una única pregunta: ¿envió realmente esta fuente de entrada una variable con este nombre? Devuelve true o false.
No lee el valor, no lo sanea ni lo valida — para eso se usa filter_input() o filter_var(). Piensa en filter_has_var() como una comprobación de presencia que examina el flujo de entrada original, en lugar de las superglobales $_GET / $_POST, que tu código puede haber modificado en tiempo de ejecución.
Sintaxis
filter_has_var(int $input_type, string $var_name): bool| Parámetro | Descripción |
|---|---|
$input_type | La fuente de entrada donde buscar. Una de las constantes INPUT_* indicadas a continuación. |
$var_name | El nombre de la variable que se va a comprobar. |
Devuelve true si existe una variable llamada $var_name en la fuente de entrada indicada, y false en caso contrario.
Constantes de fuente de entrada
| Constante | Fuente |
|---|---|
INPUT_GET | Parámetros de la cadena de consulta ($_GET) |
INPUT_POST | Cuerpo del formulario ($_POST) |
INPUT_COOKIE | Cookies de la solicitud ($_COOKIE) |
INPUT_SERVER | Variables del servidor ($_SERVER) |
INPUT_ENV | Variables de entorno ($_ENV) |
Atención:
INPUT_REQUESTeINPUT_SESSIONestán definidas como constantes pero no están implementadas. Al pasarlas siempre se devuelvefalse. Usa en su lugarINPUT_GET/INPUT_POSTde forma explícita.
Ejemplo básico
Imagina una solicitud como [email protected]. Puedes comprobar qué variables de la cadena de consulta se enviaron:
<?php
// Given the query string: [email protected]
var_dump(filter_has_var(INPUT_GET, 'email')); // bool(true) — sent
var_dump(filter_has_var(INPUT_GET, 'username')); // bool(false) — not sentSalida (cuando esa solicitud se realiza realmente al servidor):
bool(true)
bool(false)Importante:
filter_has_var()inspecciona los datos que PHP capturó al inicio de la solicitud, no el contenido actual de las superglobales$_GET/$_POST. Asignar a$_GETmás adelante en tu script no cambia lo que vefilter_has_var(). Esto también significa que devuelvefalsepara todo cuando PHP se ejecuta desde la línea de comandos, porque no hay ninguna solicitud HTTP de la que leer.
Validar que se envió un campo
El uso más habitual es proteger el manejo de formularios: confirmar que el campo existe antes de intentar validarlo. Aquí filter_has_var() distingue "el campo falta" de "el campo está presente pero es inválido".
<?php
if (filter_has_var(INPUT_POST, 'email')) {
$email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);
if ($email !== false && $email !== null) {
echo "Valid email: $email";
} else {
echo 'Invalid email address.';
}
} else {
echo 'Email field is missing.';
}Si el campo email no aparece en el cuerpo POST, se entra en la rama "falta". Si aparece pero tiene un formato incorrecto, filter_input() devuelve false y se entra en la rama "inválido".
filter_has_var() frente a isset()
A menudo se pregunta por qué no usar simplemente isset($_POST['email']). Se solapan, pero hay dos diferencias reales:
- Fuente de verdad.
isset($_POST['x'])lee el array$_POST, que tu aplicación puede haber vaciado o sobreescrito.filter_has_var()examina los datos de la solicitud originales que PHP capturó, por lo que es más difícil de engañar. - Los valores vacíos también cuentan como "presentes". Un valor enviado vacío (
newsletter=) existe, así quefilter_has_var()devuelvetrue. Si necesitas "presente y no vacío", comprueba el valor conempty():
<?php
// Simulate a present-but-empty submitted field.
$_GET['newsletter'] = '';
var_dump(isset($_GET['newsletter'])); // bool(true) — the key exists
var_dump(empty($_GET['newsletter'])); // bool(true) — but the value is emptySalida:
bool(true)
bool(true)Así, filter_has_var() confirma la presencia; combínalo con empty() cuando una cadena vacía deba tratarse como "no proporcionado".
Por qué usarlo
- Intención clara. Documenta que una ruta de código depende de una fuente de entrada específica, no de lo que haya en una superglobal.
- Guardas más seguras. Leer el flujo de entrada sin procesar evita falsos positivos de variables que tu propio código añadió en tiempo de ejecución.
- Validación componible. Separar la comprobación de presencia (
filter_has_var()) de la comprobación del valor (filter_input()/filter_var()) mantiene la lógica de validación modular y fácil de leer, lo que a su vez reduce la probabilidad de aceptar entradas inesperadas que provoquen problemas como inyección SQL o XSS.
Conclusión
filter_has_var() es una comprobación de presencia enfocada para la entrada de solicitudes: te indica si se envió una variable INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER o INPUT_ENV, y nada más. Combínalo con filter_input() o filter_var() para validar el valor, y con empty() cuando un valor vacío deba considerarse como ausente.