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>&nbsp;</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!
Abraços,
Rafael Clares
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!
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 😉
ha-ha! Curto Alec sim! Aphex Twin tbm é foda! Isso aê, vlw!
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.