W3docs

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ámetroDescripción
$input_typeLa fuente de entrada donde buscar. Una de las constantes INPUT_* indicadas a continuación.
$var_nameEl 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

ConstanteFuente
INPUT_GETParámetros de la cadena de consulta ($_GET)
INPUT_POSTCuerpo del formulario ($_POST)
INPUT_COOKIECookies de la solicitud ($_COOKIE)
INPUT_SERVERVariables del servidor ($_SERVER)
INPUT_ENVVariables de entorno ($_ENV)

Atención: INPUT_REQUEST e INPUT_SESSION están definidas como constantes pero no están implementadas. Al pasarlas siempre se devuelve false. Usa en su lugar INPUT_GET / INPUT_POST de 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 sent

Salida (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 $_GET más adelante en tu script no cambia lo que ve filter_has_var(). Esto también significa que devuelve false para 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:

  1. 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.
  2. Los valores vacíos también cuentan como "presentes". Un valor enviado vacío (newsletter=) existe, así que filter_has_var() devuelve true. Si necesitas "presente y no vacío", comprueba el valor con empty():
<?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 empty

Salida:

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.

Práctica

Práctica
¿Qué hace la función PHP filter_has_var()?
¿Qué hace la función PHP filter_has_var()?
Was this page helpful?