Como validar formulários em PHP

Atualmente, não existe a possibilidade de deixar campos de formulários online sem validação. Existem milhares de "scripts robôs" rodando por sites da Internet, prontos para encher a base de dados do seu servidor com spams e outras coisas indesejáveis.

Neste tutorial, vamos aprender como validar formulários em PHP com os seguintes dados:

  • Campos em branco: Não vamos permitir campos sem preenchimento em nosso formulário;
  • Campos numéricos: Teremos um campo onde aceitaremos apenas números;
  • Campos de URL: Teremos um campo onde aceitaremos apenas links da Internet;
  • Campos de E-mail: Teremos um campo onde aceitaremos apenas emails válidos;
  • Campos de texto: Teremos um campo de texto onde cortaremos todo o HTML enviado pelo usuário.

Então vamos lá.

O Formulário HTML5

Uma ótima novidade para desenvolvedores front-end, é que os campos de formulários em HTML5 podem ser validados diretamente pelo navegador. Basta utilizar alguns atributos e pronto! Não precisa de JavaScript para fazer a primeira validação.

Por outro lado, não podemos confiar totalmente em HTML5, pois, nem todos os navegadores suportam este formato.

O formulário que vamos utilizar em nosso treinamento é no formato HTML5, veja o código abaixo:

<!doctype html>
<html>
	<head>
		<meta charset="UTF-8">
		
		<title> Formulário HTML </title>
		
		<style>
		label{
			display: block;
		}
		</style>
	</head>
	
	<body>
		<form action="enviar.php" method="post">
			<label for="nome">Nome:</label>
			<input type="text" name="nome" id="nome" required> <br>
			
			<label for="idade">Idade:</label>
			<input type="number" name="idade" id="idade" required> <br>
			
			<label for="site">Site: </label>
			<input type="url" name="site" id="site" required> <br>
			
			<label for="email">Email: </label>
			<input type="email" name="email" id="email" required> <br>
			
			<label for="mensagem">Mensagem: </label>
			<textarea name="mensagem" id="mensagem" required></textarea> <br>
			
			<input type="submit" value="Enviar">
		</form>
	</body>
</html>

Coloque o trecho de código acima em seu arquivo "index.php", nossa validação irá ocorrer em outro arquivo chamado "enviar.php".

Validando o envio

A primeira coisa que devemos fazer, é criar o arquivo chamado "enviar.php", já que este irá receber os dados do formulário.

Neste arquivo, vamos criar uma variável com valor falso. Essa variável vai receber os erros de validação (caso ocorram).

// Cria uma variável que terá os dados do erro
$erro = false;

Iremos receber os dados através de HTTP POST. portanto, vamos verificar se algo foi postado:

// Verifica se o POST tem algum valor
if ( !isset( $_POST ) || empty( $_POST ) ) {
	$erro = 'Nada foi postado.';
}

Agora que temos a certeza de que os campos do formulário foram enviados para o $_POST, vamos configurar as variáveis dinamicamente.

Veja o próximo trecho de código:

// Cria as variáveis dinamicamente
foreach ( $_POST as $chave => $valor ) {
	// Remove todas as tags HTML
	// Remove os espaços em branco do valor
	$$chave = trim( strip_tags( $valor ) );
	
	// Verifica se tem algum valor nulo
	if ( empty ( $valor ) ) {
		$erro = 'Existem campos em branco.';
	}
}

Perceba que já estamos removendo todas as tags HTML e todos os espaços em branco do início e fim dos valores dos inputs. Isso nos garante um nível a mais em segurança.

Agora que temos as variáveis, podemos fazer as verificações diretamente. Vamos começar pelo campo "Idade", nele só iremos aceitar valor numérico. Veja:

// Verifica se $idade realmente existe e se é um número. 
// Também verifica se não existe nenhum erro anterior
if ( ( ! isset( $idade) || ! is_numeric( $idade ) ) && !$erro ) {
	$erro = 'A idade deve ser um valor número.';
}

Agora vamos verificar o site na seguinte ordem:

  • Se a variável $site existe;
  • Ou se o valor é uma URL verdadeira;
  • E se não existe nenhum erro anterior.

Veja como fica no código:

// Verifica se $site realmente existe e se é uma URL. 
// Também verifica se não existe nenhum erro anterior
if ( ( ! isset( $site ) || ! filter_var( $site, FILTER_VALIDATE_URL ) ) && !$erro ) {
	$erro = 'Envie um site válido.';
}

Agora vamos verificar o email na seguinte ordem:

  • Se a variável $email existe;
  • Se é um email válido
  • Se não existe erro anterior.

Veja o código:

// Verifica se $email realmente existe e se é um email. 
// Também verifica se não existe nenhum erro anterior
if ( ( ! isset( $email ) || ! filter_var( $email, FILTER_VALIDATE_EMAIL ) ) && !$erro ) {
	$erro = 'Envie um email válido.';
}

Agora já fizemos toda a verificação necessária, então, vamos fazer o seguinte:

  • Verificar se existe algum erro;
  • Se existir, apenas exibimos o valor do erro;
  • Se a variável erro continuar falsa, podemos fazer o que quisermos com os dados.

Veja o código para verificarmos se existe algum erro:

// Se existir algum erro, mostra o erro
if ( $erro ) {
	echo $erro;
} else {
	// Se a variável $erro continuar com valor falso
	// Você pode fazer o que preferir aqui, por exemplo, 
	// enviar para a base de dados, ou enviar um email
	// Tanto faz. Vou apenas exibir os dados na tela.
	echo "<h1> Veja os dados enviados</h1>";
	
	foreach ( $_POST as $chave => $valor ) {
		echo '<b>' . $chave . '</b>: ' . $valor . '<br><br>';
	}
}

Perceba que dentro do "else", podemos fazer qualquer ação necessária. Como criar uma mensagem para enviar um email, ou ainda enviar os dados para uma base de dados (vamos ver isso em aulas posteriores).

A validação PHP completa

Caso queira copiar o arquivo PHP inteiro para testes, segue o código abaixo:

<?php 
// Cria uma variável que terá os dados do erro
$erro = false;

// Verifica se o POST tem algum valor
if ( !isset( $_POST ) || empty( $_POST ) ) {
	$erro = 'Nada foi postado.';
}

// Cria as variáveis dinamicamente
foreach ( $_POST as $chave => $valor ) {
	// Remove todas as tags HTML
	// Remove os espaços em branco do valor
	$$chave = trim( strip_tags( $valor ) );
	
	// Verifica se tem algum valor nulo
	if ( empty ( $valor ) ) {
		$erro = 'Existem campos em branco.';
	}
}

// Verifica se $idade realmente existe e se é um número. 
// Também verifica se não existe nenhum erro anterior
if ( ( ! isset( $idade ) || ! is_numeric( $idade ) ) && !$erro ) {
	$erro = 'A idade deve ser um valor número.';
}

// Verifica se $site realmente existe e se é uma URL. 
// Também verifica se não existe nenhum erro anterior
if ( ( ! isset( $site ) || ! filter_var( $site, FILTER_VALIDATE_URL ) ) && !$erro ) {
	$erro = 'Envie um site válido.';
}

// Verifica se $email realmente existe e se é um email. 
// Também verifica se não existe nenhum erro anterior
if ( ( ! isset( $email ) || ! filter_var( $email, FILTER_VALIDATE_EMAIL ) ) && !$erro ) {
	$erro = 'Envie um email válido.';
}

// Se existir algum erro, mostra o erro
if ( $erro ) {
	echo $erro;
} else {
	// Se a variável erro continuar com valor falso
	// Você pode fazer o que preferir aqui, por exemplo, 
	// enviar para a base de dados, ou enviar um email
	// Tanto faz. Vou apenas exibir os dados na tela.
	echo "<h1> Veja os dados enviados</h1>";
	
	foreach ( $_POST as $chave => $valor ) {
		echo '<b>' . $chave . '</b>: ' . $valor . '<br><br>';
	}
}

Modifique o código acima como preferir.

Download

Caso queira baixar o formulário e a validação acima, utilize o link abaixo:

Concluindo

A validação PHP acima é apenas um exemplo simples para que você possa utilizar o que aprendeu até aqui em nosso curso de PHP gratuito. Embora ela funcione perfeitamente, existem práticas mais avançadas e eficazes para validação de formulários.

Caso queira aprimorar o trecho de código desse artigo, deixe-nos saber nos comentários.