filter_has_var()
Aprenda a usar a função PHP filter_has_var(): sintaxe, constantes de origem de entrada, diferenças em relação a isset() e exemplos práticos.
filter_has_var() verifica se uma variável de uma fonte de entrada específica (GET, POST, cookies, servidor ou ambiente) existe. Esta página aborda sua sintaxe, as constantes de fonte de entrada, como ela difere de isset(), e os erros comuns que costumam pegar as pessoas de surpresa.
O que filter_has_var() faz
filter_has_var() responde a uma única pergunta: essa fonte de entrada realmente enviou uma variável com esse nome? Ela retorna true ou false.
Ela não lê o valor, não o sanitiza nem o valida — para isso você usa filter_input() ou filter_var(). Pense em filter_has_var() como uma verificação de presença que examina o fluxo de entrada original, em vez dos superglobais $_GET / $_POST, que seu código pode ter modificado em tempo de execução.
Sintaxe
filter_has_var(int $input_type, string $var_name): bool| Parâmetro | Descrição |
|---|---|
$input_type | A fonte de entrada a ser consultada. Um dos constantes INPUT_* abaixo. |
$var_name | O nome da variável a ser verificada. |
Retorna true se uma variável chamada $var_name estiver presente na fonte de entrada fornecida, e false caso contrário.
Constantes de fonte de entrada
| Constante | Fonte |
|---|---|
INPUT_GET | Parâmetros de query string ($_GET) |
INPUT_POST | Corpo do formulário ($_POST) |
INPUT_COOKIE | Cookies da requisição ($_COOKIE) |
INPUT_SERVER | Variáveis do servidor ($_SERVER) |
INPUT_ENV | Variáveis de ambiente ($_ENV) |
Atenção:
INPUT_REQUESTeINPUT_SESSIONsão definidos como constantes, mas não estão implementados. Passá-los sempre retornafalse. UseINPUT_GET/INPUT_POSTexplicitamente.
Exemplo básico
Imagine uma requisição como [email protected]. Você pode verificar quais variáveis de query string foram enviadas:
<?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 sentSaída (quando essa requisição é de fato feita ao servidor):
bool(true)
bool(false)Importante:
filter_has_var()inspeciona os dados que o PHP capturou no início da requisição, não o conteúdo atual dos superglobais$_GET/$_POST. Atribuir a$_GETposteriormente no seu script não altera o quefilter_has_var()enxerga. Isso também significa que ela retornafalsepara tudo quando o PHP é executado pela linha de comando, pois não há requisição HTTP para ler.
Validando que um campo foi enviado
O uso mais comum é proteger o processamento de formulários: confirmar que o campo existe antes de tentar validá-lo. Aqui, filter_has_var() distingue "o campo está ausente" de "o campo está presente, mas é 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.';
}Se o campo email nunca aparecer no corpo do POST, você cai no ramo "ausente". Se ele aparecer mas estiver malformado, filter_input() retorna false e você cai no ramo "inválido".
filter_has_var() vs. isset()
As pessoas frequentemente perguntam por que não usar apenas isset($_POST['email']). Elas se sobrepõem, mas há duas diferenças reais:
- Fonte de verdade.
isset($_POST['x'])lê o array$_POST, que sua aplicação pode ter removido ou sobrescrito.filter_has_var()examina os dados da requisição original capturados pelo PHP, tornando-a mais difícil de enganar. - Valores vazios ainda contam como "presentes". Um valor enviado vazio (
newsletter=) existe, entãofilter_has_var()retornatrue. Se você precisar de "presente e não vazio", verifique o valor comempty():
<?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 emptySaída:
bool(true)
bool(true)Portanto, filter_has_var() confirma a presença; combine-a com empty() quando uma string vazia deve ser tratada como "não fornecida".
Por que usá-la
- Intenção clara. Documenta que um trecho de código depende de uma fonte de entrada específica, e não apenas do que estiver em um superglobal.
- Proteções mais seguras. Ler o fluxo de entrada bruto evita falsos positivos de variáveis que seu próprio código adicionou em tempo de execução.
- Validação componível. Separar a verificação de presença (
filter_has_var()) da verificação de valor (filter_input()/filter_var()) mantém a lógica de validação modular e fácil de ler, reduzindo a chance de aceitar entradas inesperadas que levam a problemas como injeção SQL ou XSS.
Conclusão
filter_has_var() é uma verificação de presença focada para entradas de requisição: ela informa se uma variável INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER ou INPUT_ENV foi enviada, e nada mais. Combine-a com filter_input() ou filter_var() para validar o valor, e com empty() quando um valor vazio deve ser considerado como ausente.