Validar Formulários – Server Side [PHP]

  • Autor do post:
  • Categoria do post:PHP DEV

Validando formulários do lado servidor com PHP e gerando automaticamente a validação javascript e SQL Query Insert

Olá, nesse post vamos ver como validar de uma forma alternativa um formulário no lado servidor, vale lembrar que validar formulários apenas com javascript não é seguro devido a possibilidade de o usuário estar com o javascript desabilitado em seu browser, então além da validação javascript é indispensável a validação no lado servidor.
Para não cairmos no “retrabalho”, ou seja, criar 2 validações com o mesmo propósito resolvi escrever uma classe simples que ao validar o formulário no lado servidor retorna também a validação javascript.
Bem, vale lembrar que tanto esta como todas as demais classes que disponibilizo aqui são para uso didático e cabe aos interessados melhora-la de forma que seja útil e adequada as necessidades de cada um, trata-se de uma simples classe com o propósito de dar uma direção aos interessados à aprimorá-la.
Chega de blá-blá-blá!!!

Vamos iniciar com o bom e velho html

<html>
<head>
 <title>Form</title>
</head>
<body>
 <form name="form_login" method="post" action="index.php">
 <label>Nome: </label>
 <input type="text" name="c1" id="c1">

 <label>Idade:</label>
 <input type="text" name="c2" id="c2">

 <label>Mail:</label>
 <input type="text" name="c3" id="c3">

 <p> </p>
 <input type="submit" value="send now!">
 </form>
 <?if(isset($_POST)) require_once 'post.php';?>
</body>
</html>

Neste código acima temos:

– Campos do formulários cujos nomes estão em um padrão (c1,c2,c3) campo 1, campo 2, campo 3
Utilizaremos esse formato para facilitar a criação do formulário e dar menos preocupação na hora de validar, ao invés de nos atentar ao nomes convencionais como, usuario, senha, endereco, etc…
É claro que a nomenclatura dos campos é fundamental e necessária, lembre-se que estamos falando de um exemplo para utilização didática e não vamos nos atentar na nomenclatura neste post.
Outro motivo pelo qual utilizaremos um padrão simples para o nome dos campos é a utilização que faremos de um método da classe e explicarei mais adiante o motivo da existência deste método.

Perceba também que além do html puro temos uma linha PHP, neste caso eu quis apenas diminuir o tamanho do post, veja que o formulário submete os dados para a mesma página, que neste caso seria algumacoisa.php, por esse motivo é que inclui o arquivo post.php na página, o ideal é que html fique separado do php, ou seja, o formulário deve ser submetido ao arquivo post.php e a linha que inclui o post.php deveria sair do html. Acho que entenderam, eu ao invés de submeter os dados ao post.php estou enviando para a mesma página e incluido o arquivo post.php nela (wrong).
Ha-ha sei que já entenderam mas para finalizar… ao submeter os dados do formulário para a mesma página o arquivo post.php será incluso para que ocorra a validação (foi mal).

Vamos ver o arquivo post.php responsável pela validação do formulário e mensagem de retorno.

 <?php
 # inclui a classe reqform
 require_once 'reqform.class.php';
 # verifica se o form foi submetido
 if(isset($_POST) && !empty($_POST))
 {
 # criar o obj
 $form = new reqForm($_POST);
 # altera a exibição do nome do campo
 $form->humanize( 'c1' , 'Nome' );
 $form->humanize( 'c2' , 'Idade' );
 $form->humanize( 'c3' , 'Mail' );
 # informa quais campos são obrigatórios
 $form->required( array( 'c1' , 'c2' , 'c3' ) );
 # informa quais tipos devem conter os campos
 $form->type( array( 'c1' => 'text' , 'c2' => 'numeric' , 'c3' => 'email' ) );
 # valida os dados do formulário
 if( $form->isValid() )
 {
 // recursos opcionais validacao js e sql insert query
 # printa na tela a validação Jscript
 $form->message  = $form->JsValid( 'form_login' );
 # printa na tela a query SQL
 $form->message .= $form->genSql( 'table_users' );
 // exemplo de utilização do método genSql
 #mysql_query($form->genSql('table_users'));
 }
 # printa o retorno da validação
 print  $form->message;
 }
?>

Entenderemos algumas linhas desse arquivo post.php

$form->humanize( ‘c1’ , ‘Nome’ )
– esta linha altera a exibição do nome do formulário de ‘c1’ para ‘Nome’
Este recurso é aplicado apenas ns mensagens de retorno da validação para que o usuário compreenda a mensagem, tal que não ocorreria muito bem se a mensagem retornada ao usuário fosse
Por favor preencha o campo c1, onde c1 trata-se do campo ‘Nome’.

Daí você me pergunta:
– Por que não já colocarmos o nome do campo corretamente?

Bem, isso é o correto à se fazer, existem algumas situações em que a nomenclatura atrapalha um pouco na produtividade, comentarei algumas:
– Quando o nome do campo é muito extenso, por ex  endereco_completo, onde_nos_conheceu, etc..
Mas o real motivo da existência do método humanize() é um que eu enfrento com frequência, veja…
Alguém já pegou um formulário criado por um amador ou até mesmo pelo próprio cliente para criar o envio de e-mail ou gravar em banco de dados ?
Difícil acontecer não é?  Mas eu consigo essas coisas, impressionante, são 100 campos na seguinte forma field_1 field_2, etc…
Quem está afim de alterar o nome do campo em: formulário, post PHP, SQL query e javascript ? É chato demais!
No entanto se eu utilizar o método humanize() eu escrevo o nome ideal para o campo apenas uma única vez.

Se eu fizer no post PHP  $form->humanize( ‘c1’ , ‘Nome’ )
Então terei a mensagem de retorno, a validação javascript e a query automaticamente.
Pode ser uma péssima justificativa mas pode ser também mais produtivo em pequenos projetos.

Vamos falar da linha
$form->required( array( ‘c1’ , ‘c2’ , ‘c3’ ) );
A linha acima diz que os campos c1, c2, c3 são de preenchimento obrigatório, se não forem preenchidos a mensagem de retorno irá informar o usuário. É isso!

A linha
$form->type( array( ‘c1’ => ‘text’ , ‘c2’ => ‘numeric’ , ‘c3’ => ‘email’ ) );
Essa é uma boa linha, ela seta o tipo de dado que deve ser submetido de cada campo.
Para o campo c1 deve ser enviado texto
Para o campo c2 deve ser enviado número
Para o campo c3 deve ser enviado e-mail válido

Caso o usuário digite tipos diferentes a validação irá retornar na mensagem, claro!
Ah vamos, é útil sim !

Caso deseje adicionar mais tipos, altere o método checkType() da classe.

A linha
$form->message  = $form->JsValid( ‘form_login’ );
Também é uma linha legal, ela cria e printa na tela o script de validação em javascript e você pode e deve utiliza-la somente 1 vez para criar o script e copia-lo para um .js, depois você deve comentar essa linha, é claro, senão o usuário receberá na tela o script de validação, irá se assustar e tirara máquina da tomada (que horror, peguei pesado né, é que estou ouvindo Atari Teenage Riot).
O parâmetro passado no método deve ser o nome do formulário e ao final será também o nome do método JS.

A última linha
$form->message .= $form->genSql( ‘table_users’ );
Bem, essa linha aí vai retornar um sql insert completa com os dados do formulário, considerando é claro que os campos do formulário e da tabela possuem a mesma identificação.
Deve ser comentada ou apagada assim como a que gera o javascript, claro!
O parâmetro passado no método deve ser o nome da tabela.

Considerações finais

Quanto a nomenclatura dos campos, você pode criar normalmente os campos com os nomes corretos, tais como, usuario, endereco, etc…
Isso não descarta a utilização do método humanize(), pois poderá utiliza-lo para retornar a mensagem correta ao usuário, veja no exemplo:
humanize( ‘endereco’ , ‘endereço’)
humanize( ‘usuario’, ‘usuário’)
Nesse caso você não precisará reescrever as palavras com os acentos no script  para retornar a mensagem ao usuário, então eu em momento algum quis dizer que devem  colocar o nome do campo de ‘c1’ ao invés de ‘usuario’, a idéia dos c’s foi para deixar mais limpo o código e exemplificar a utilização do método humanize() que não se limita a encurtar nomes de campos e sim descrever a palavra corretamente para o usuário, e sinceramente, não encontrei um nome legal para o método huhauahuahua alterem tudo aí quem sabe dá vontade de testar, ah, an, hun, hein …

Importante!

É claro que isso não descarta a validação javascript, isso faria com que o usuário tivesse que preencher novamente o formulário, a idéia é utilizar a classe para criar a validação básica em JS e em seguida você irá apenas alterar o código javascript, ao menos irá reduzir o tempo digitando o código JS.
A utilização servirá para validar o lado servidor caso algo passe pelo javascript.

Obs: Não deixe de dar uma olhada na classe!

Demo Link
Download Link

Abraços,

Rafael Clares

Este post tem 4 comentários

  1. Brayan

    Fala Rafael, cara parabéns pelo tutorial e pela classe, ficou tudo muito bom. Só tive um problema que foi

    dae eu substitui os por

    Depois funcionou tudo certo, parabéns mais uma vez
    Sucesso!

  2. Fabio Souto

    Muito bom o seu tutorial/artigo, normalmente eu nao ia parar aqui para postar comentarios, mas resolvi fazer isso depois que fiquei sabendo que voce curte ATR 😉 Voce ja escutou alguns albuns do Alec Empire? tem uns trizinhos tambem… Voltando ao assunto principal: eu vou dar uma olhada na sua classe quando terminar de ler o post, nao que eu va realmente usa-la mas eh que eu sempre aprendo alguma coisa nova de OOP ao ler o codigo dos outros 😉

    1. Rafael Clares

      ha-ha! Curto Alec sim! Aphex Twin tbm é foda! Isso aê, vlw!

  3. Flaviano

    Olá Rafael !
    Gostaria de agradecer pelas informações que você tem postado no seu site.
    Estou começando a “fuçar” no php e os tutos disponibilizados são bem fáceis de compreender.

Os comentários estão encerrados.