Limpeza e validação de dados com PHP
Neste artigo vamos ver como funciona a sanitização e validação de dados com PHP. Você vai ver como é possível tratar dados recebidos a partir de formulários antes de fazer a gravação para o seu banco de dados.
A padronização e validação de dados é um processo muito importante que garante a qualidade das informações do seu banco de dados.
Qual a diferença entre sanitização e validação?
No processo de sanitização, se remove os caracteres desnecessários. Uma vez feito este processo, se parte para o processo de validação, que consiste em verificar se o dado recebido atende as necessidades de nosso modelo de negócios.
Antes de iniciar a sanitização, é necessário verificar se o campo está sendo recebido. Para isso, fazemos uso da função isset()
$CEP = "";
if (isset($_POST["CEP"])){
$CEP = $_POST["CEP"];
}
Neste exemplo, verificamos se existe um campo enviado por POST chamado CEP. Sem a utilização do isset(), caso o campo não exista e você tente fazer a leitura, vai receber um alerta de erro do tipo NOTICE chamado "Undefined index"
Uma vez recebido o dado, podemos proceder a limpeza. O processo de limpeza pode ser composto de remover espaços em branco desnecessários ou padronizar o conteúdo recebido.
Para a remoção de espaços desnecessários utilizamos a função trim(). Esta função remove espaços no começo ou no fim da string.
$nome = " teste 123 ";
$nome = trim($nome);
echo $nome;
Para a padronição do conteúdo, podemos padronizar o conteúdo recebido para letras maíusculas ou minúsculas. Para mudar para maíusculo podemos usar strtoupper() e para mudar para minúsculo podemos usar strtolower().
$nome = " teste 123 ";
$nome = trim($nome);
echo strtoupper($nome);
echo strtolower($nome);
A remoção de caracteres indesejados também faz parte do processo de sanitização. Por exemplo, você pode querer tratar uma informação do tipo Código Postal (CEP) apenas aproveitando a parte numérica. Uma forma simples seria remover os caracteres indesejados usando str_replace()
$CEP = "01532-001";
$CEP = str_replace("-","",$CEP);
echo $CEP;
Para este caso, não seria a melhor abordagem. Uma abordagem mais apropriada seria utilizar uma expressão regular, para isso utilizamos a função preg_replace();
$CEP = "CEP:01532-001";
$CEP = preg_replace("/[^0-9]/", "", $CEP);
echo $CEP;
Agora vamos falar sobre o processo de validação. Com os dados padronizados, o processo de validação pode compreender:
- A validação do tipo de dados
- A validação do tamanho da informação
- A validação se o formato está correto.
- Se a informação é unica, ou seja, se ela já não existe em seu banco de dados.
Pode ser necessário que uma determinada informação siga um certo tipo de dados, por exemplo o dado ser do tipo número ou data. Para verificar se uma informação é um número podemos usar a função isnumeric().
$campo1 = "123";
if (is_numeric($campo1)){
echo "Campo 1 é um número";
} else {
echo "Campo 1 não é um número";
}
$campo2 = "Teste 123";
if (is_numeric($campo2)){
echo "Campo 2 é um número";
} else {
echo "Campo 2 não é um número";
}
Para validarmos se uma data é valida podemos utilizar a classe DateTime. Podemos converter o valor num objeto e formatar a resposta para comparar com o valor original.
$data = "30/02/2023";
$d = DateTime::createFromFormat("d/m/Y", $data);
if($d && $d->format("d/m/Y") == $data){
echo "data valida";
}else{
echo "data inválida";
}
O processo de validação do formato também pode ser feito utilizando filter_input. No exemplo a seguir validamos se um campo chamado idade recebido através de um POST está dentro de um intervalo considerado válido
$opcoes = array("options" => array("min_range" => 0, "max_range" => 18 ));
if($idade = filter_input(INPUT_POST, "idade", FILTER_VALIDATE_INT, $opcoes)){
echo "A idade é até 18 anos";
}else{
echo "A idade é maior que 18 anos";
}
Podemos também usar o filter_input para validar por exemplo se um determinado campo recebido por POST ou GET está no formato de um e-mail válido
if($email = filter_input(INPUT_POST, "email", FILTER_VALIDATE_EMAIL)){
echo "E-mail válido";
}else{
echo "E-mail inválido ou não informado";
}
Perceba que nos dois exemplos anteriores a função filter_input recebeu um número diferente de argumentos. Os 3 primeiros são obrigatórios, o primeiro é a forma como o dado está sendo recebido, se é através de POST ou GET, o segundo é o nome do campo e o terceiro é o tipo de filtro a ser aplicado. Já o quarto parâmetro é opcional, serve para refinar o filtro aplicado. Uma lista de filtros que podem ser utilizados nesta função pode ser consultado neste link:
https://categoriaoutros.com.br/?p=4299
Vamos ver agora como funciona a validação do tamanho de uma string. Para retornar a quantidade de caracteres de uma string utilizamos a função strlen();
$nome = "TESTE 123";
if (strlen($nome) < 10){
echo "ERRO";
} else {
echo "OK";
}
No exemplo acima o código retorna a mensagem ERRO sempre que a string informada tiver menos de 10 caracteres.
A validação se o formato está de acordo com uma determinada regra de negócio depende muito do seu modelo de negócio. Geralmente validações de formato simples podem ser resolvidas utilizando expressões regulares. No exemplo a seguir vamos ver como validar se uma informação está no formato de um CEP válido.
$CEP = "01532-001";
if (preg_match("/[0-9]{5,5}([- ]?[0-9]{4})?$/", $CEP))
echo "CEP inválido";
} else {
echo "CEP válido";
}
Validações mais específicas como o caso de verificar se um e-mail tem um determinado domínio ou se um determinado número de CPF está no formato certo exigem uma programação mais complexa para ser validados. No artigo a seguir eu mostro como é possível criar uma validação para números de CPF e CNPJ.