Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Lab Design

Validação CPF e CNPJ em php

Recommended Posts

Todos sabemos que a maioria das validações são feitas em JS então criamos rotinas e mais rotinas em JS para essa finalidade mas isso não é suficiente.Sou webmaster de muitos sites e lojas virtuais e nunca havia me preocupado na validação de dados no server-side embora tenha percebido diversas falhas inexplicáveis do JS.Verificando a base de dados de um cliente eu percebi que tinha vários CPF's e CNPJ's sem qualquer formatação embora no script de cadastro tem uma rotina para validação e formatação antes do submit, então eu acredito numa falha do JS na máquina do usuario ou o mesmo poderia estar desativado ou desatualizado, sei lá, peguei tambem alguns casos de nomes em minúsculas, alguns emails em maiúculas e toda essa validação tem no JS do cadastro e testado milhares de vezes... bom cheguei então a conclusão que não dá pra ficar sem fazer algumas validações no server-side principalmente de dados importantes como cpf e cnpj, senhas, emails, etc...Abaixo algumas soluções encontradas...1) Para os casos de maiúculas e minúsculas, após fazer o trim ou utf8_decode se for ajax,colocar diretamente na query insert into tabela tal(nome, email) values(upper('$nome',lower('$email') ou update update tabela ta nome=upper('$nome'), email=lower('$email') e assim por diante.Isso além de evitar a caca do php na conversão pois ele converte os caracteres normais mas os acentuados ele deixa em caixa baixa, garante que os dados que devem ser caixa alta sejam gravados em caixa alta e dados como email sejam gravados sempre em caixa baixa.Isso resolveu parte do problema.2) Recentemente eu peguei um caso na base de dados em que o email do cara estava: fulano@yahoo simplesmente. Isso não passaria pela minha rotina em JS nem a pau mas falhou a validação, então é importante verificar antes de gravar se a sintaxe do email está correta pelo menos.ex.: validação de email em JS:/* ******************** checkEmail ******************** */ function checkEmail(objForm) { var invalid; invalid = /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,4})+$/; if (objForm.value == '') { alert('Campo '+objForm.name.toUpperCase()+' não pode ficar em branco!'); objForm.focus(); return false; } if (invalid.test(objForm.value) == false) { oldColor=objForm.style.color; objForm.style.color = "#c40000"; alert("Favor informar corretamente seu e-mail."); objForm.focus(); objForm.style.color=oldColor; return (false); } return true; } // end functionConsegui uma expressão para validar email em php.

function emailCheck($email) { $email = trim($email); if ((ereg("^([0-9,a-z,A-Z]+)([.,_,-]([0-9,a-z,A-Z]+))*[@]([0-9,a-z,A-Z]+)([.,_,-]([0-9,a-z,A-Z]+))*[.]([0-9,a-z,A-Z]){2}([0-9,a-z,A-Z])?$", $email)) && (!empty($email))) { return true; } else { return false; } }

Isso pelo menos garante que o email está correto se existe ou não é um caso à parte.3) outro campo que é preciso cuidados especiais também é o cpf/cnpj pois se gravarmos como o usuario digita, o mesmo pode ficar sem qualquer separação, com formatação errada, ponto em lugar de traço e por aí afora e depois dificultar uma busca futura pelo proprio usuário. Então criei baseado na rotina JS que funciona perfeitamente, uma rotina em php pra validar e formatar o cpf ou cnpj e está abaixo pra ser utilizada a vontade. Só não tire os meus créditos por favor.

<?php/********************************************************** Rotina em php para validação e formatãção de cpf e cnpj criada por Lauro A L Brito - 14/03/2007**********************************************************/// modulo 11 para validação de CPF e CNPJfunction check_cnpj_cpf($source,$f) { /* $f=formato de saída 0 = sem formatação, retira '.','/','-' volta só digitos 2 = com formatação: 99.999.999/9999-99 ou 999.999.999-99*/ $s=ereg_replace("[' '-./ \t]",'',$source); // retira caracteres de separação inclusive espaço - o /t não sei o que significa $len=strlen($s)-2; // pega o tamanho da string menos 2 que são os digitos verificadores if ($len != 9 && $len != 12) return false; // se for <> 9 ou <> 12 retorna pois a quantidade de dígitos está errada. $num= substr($s,0,$len); // pega so a parte do numero sem o dv $dv = substr($s,-2); // pega somente o dv $d1 = 0; // verifica o primeiro dv for ($i = 0; $i < $len; $i++) { if ($len==11) $d1 += $num[11 - $i] * (2 + ($i % 8)); // expressão para cnpj else $d1 += $num[$i] * (10 - $i); // expressão para cpf } if ($d1==0) return false; $d1 = 11 - ($d1 % 11); if ($d1 > 9) $d1 = 0; if ($dv[0] != $d1) return false; $d1 *= 2; // verifica o segundo dv for ($i = 0; $i < $len; $i++) { if ($len==11) $d1 += $num[11 - $i] * (2 + (($i + 1) % 8)); // expressão para cnpj else $d1 += $num[$i] * (11 - $i); // expressão para cpf } $d1 = 11 - ($d1 % 11); if ($d1 > 9) $d1 = 0; if ($dv[1] != $d1) return false; if ($f==0) return($s); // retorna o numero limpo sem '.', '-', '/' // retorna cpf formatado $formato=($len==9) ? '###.###.###-##' : '##.###.###/####-##'; // seleciona a máscara para cpf ou cnpj $indice=-1; for ($x=0; $x < strlen($formato); $x++) { if ($formato[$x]=='#') $formato[$x] =$s[++$indice]; } return($formato); // retorna cpf ou cnpj formatado } //// testes$cnpj=(check_cnpj_cpf('00844237/000400', 0));if (!$cnpj) echo "cnpj inválido<br>";else echo "cnpj $cnpj válido mas formatação<br>"; $cnpj=(check_cnpj_cpf('00844237/000400', 1));if (!$cnpj) echo "cnpj inválido<br>";else echo "cnpj $cnpj válido com formatação<br>"; echo"<br><br>";$cpf=(check_cnpj_cpf('905.404768-20', 0));if (!$cpf) echo "cpf inválido<br>";else echo "cnpj $cpf válido sem tratamento<br>"; $cpf=(check_cnpj_cpf('905404768/20', 1));if (!$cpf) echo "cpf inválido<br>";else echo "cnpj $cpf válido com formatação<br>";?>

Para verificar a validação, basta alterar qualquer dado nos valores acima...

Compartilhar este post


Link para o post
Compartilhar em outros sites

isso nao é problema, porque para validar um cpf ou cnpj o que importa é o numero e nao sua formatação, formatação é visual, voce pode ter no banco os numeros e na hora de mostrar voce formata

a maioria dos sistemas WEB que presta hoje em dia só pede o numero mesmo, e nao deixa o usuario formatar

javascript nunca pode ser usado para validações importantes ele ajuda mas nao é seguro, pois basta alguem desligar o javascript e pronto, mas acredito que a maioria dos sistemas tambem validam via PHP isso é o minimo de segurança que deve ter

Compartilhar este post


Link para o post
Compartilhar em outros sites

Todos sabemos que a maioria das validações são feitas em JS então criamos rotinas e mais rotinas em JS para essa finalidade mas isso não é suficiente.Sou webmaster de muitos sites e lojas virtuais e nunca havia me preocupado na validação de dados no server-side embora tenha percebido diversas falhas inexplicáveis do JS.Verificando a base de dados de um cliente eu percebi que tinha vários CPF's e CNPJ's sem qualquer formatação embora no script de cadastro tem uma rotina para validação e formatação antes do submit, então eu acredito numa falha do JS na máquina do usuario ou o mesmo poderia estar desativado ou desatualizado, sei lá, peguei tambem alguns casos de nomes em minúsculas, alguns emails em maiúculas e toda essa validação tem no JS do cadastro........

Amigo, achei seu artigo muito interessante. Gostaria de saber se você pode me esclarecer uma dúvida.Supondo que a tabela já tenha cadastrado vários dados, inclusive CPF.Como recuperar o nome da pessoa correspondente ao CPF sem ter que recarregar a página. É possível?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim é possivel atraves do ajax:Voce teria que colocar o campo nome dentro de um objeto identificado por id, pode ser <p> <td> ou de preferencia um <div> e colocar uma forma de ao digitar o cpf, fazer uma chamada a uma rotina em javascript para acionar no server um pequeno script que leia somente o nome na base de dados e retorne o conteudo diretamente para essa área:Através do ajax voce consegue alterar qualquer dado em qualquer lugar da pagina sem refresh porém essa área tem que ser identificada por id.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ola sei q o tópico ja meio antigo mais testei o seu script aqui o somente o seu cnpj funciona no script, tentei vários outros cnpjs válidos registrados mais não funcionou no seu script....

 

somente o seu cnpj fala q é valido outros cnpjs ele me responde como invalido....

 

se eu estiver errado me desculpe....

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.