Terça-feira, 30 de setembro de 2003 às 01h59

Validação de CPF usando PHP

Fala galera!

Essa semana apresentarei um script simples que tem por finalidade fazer a validação do CPF digitado. É aconselhável fazer, primeiramente, a validação em JavaScript e depois, por motivos de segurança, fazer essa verificação lá no servidor utilizando o PHP, isso porque, é muito simples de se ignorar uma validação em JavaScript e com isso nosso sistema acaba se tornando vulnerável.

PS: Nesse artigo, estarei apresentando apenas a versão do script em PHP.

Vamos lá:

Arquivo: cpf.php

<?
//VERIFICA SE O FORMULÁRIO FOI ENVIADO
if($_POST["verOK"]) {
 //RECEBE OS DADOS DO FORMULÁRIO
 $cpf = $_POST["cpf"];

 //VERIFICA SE O QUE FOI INFORMADO É NÚMERO
 if(!is_numeric($cpf)) {
  $status = false;
 }


 else {
  //VERIFICA
  if( ($cpf == '11111111111') || ($cpf == '22222222222') ||
   ($cpf == '33333333333') || ($cpf == '44444444444') ||
   ($cpf == '55555555555') || ($cpf == '66666666666') ||
   ($cpf == '77777777777') || ($cpf == '88888888888') ||
   ($cpf == '99999999999') || ($cpf == '00000000000') ) {
   $status = false;
  }

  else {

   //PEGA O DIGITO VERIFIACADOR
   $dv_informado = substr($cpf, 9,2);

   for($i=0; $i<=8; $i++) {
    $digito[$i] = substr($cpf, $i,1);
   }


   //CALCULA O VALOR DO 10º DIGITO DE VERIFICAÇÂO
   $posicao = 10;
   $soma = 0;

   for($i=0; $i<=8; $i++) {
    $soma = $soma + $digito[$i] * $posicao;
    $posicao = $posicao - 1;
   }

   $digito[9] = $soma % 11;

   if($digito[9] < 2) {
    $digito[9] = 0;
   }
   else {
    $digito[9] = 11 - $digito[9];
   }


   //CALCULA O VALOR DO 11º DIGITO DE VERIFICAÇÃO
   $posicao = 11;
   $soma = 0;

   for ($i=0; $i<=9; $i++) {
    $soma = $soma + $digito[$i] * $posicao;
    $posicao = $posicao - 1;
   }

   $digito[10] = $soma % 11;

   if ($digito[10] < 2) {
    $digito[10] = 0;
   }
   else {
    $digito[10] = 11 - $digito[10];
   }


  //VERIFICA SE O DV CALCULADO É IGUAL AO INFORMADO
  $dv = $digito[9] * 10 + $digito[10];
  if ($dv != $dv_informado) {
   $status = false;
  }
  else
   $status = true;
  }
//FECHA ELSE
}//FECHA ELSE(is_numeric)
}//FECHA IF($_POST)
?>

<html>
<head>
<title>::.. 79º artigo PHP - iMasters</title>
</head>
<body bgcolor="#FFFFFF">
<h2>79º artigo PHP - iMasters</h2>
<form name="frm_cpf" action="<? echo $_SERVER["PHP_SELF"];?>" method="post">
CPF: <input type="text" name="cpf" maxlength="11">
<input type="submit" value="Validar CPF" name="btnValidar">
<input type="hidden" name="verOK" value="1">
</form>

<?
//VERIFICA O RESULTADO
if($_POST["verOK"]) {
 echo "<br><font face='Arial' size='2' color='#FF0000'><b>Resultado:</b></font><br><br>";
 if($status)
  echo "<b>O CPF $cpf é VERDADEIRO</b>";
 else
  echo "<b>O CPF $cpf é INVÁLIDO</b>";
}
//FECHA IF
?>
</body>
</html>

Screenshot:

Comentários:

01. Quando o formulário for enviado, verificamos se o dados digitados são numéricos, para isso usamos a função is_numeric.

02. Verifiquei se o CPF informado possui valores repetido, fiz isso manualmente, se alguém tiver alguma sugestão melhor é só enviar. Fiz isso, pq se digitarmos o CPF 11111111111 ou qualquer outro com numeração repetida vai dar verdadeiro, portanto, coloquei aquele IF para verificar e bloquear esse pequeno problema.

03. Para terminar verificamos os dígitos verificadores e enviamos o resultado da nossa validação para a tela do usuário.

DOWNLOAD

Clique AQUI e faça o download do script.

Não deixe de nos enviar críticas ou sugestões para o próximo assunto, afinal a coluna é de vocês.

Boa semana a todos!

7 comentários

 paulo cesar da silva moreira
18/11/2004 12h16

Erro na linha 3 e 91

Copiei do jeito que foi postado o artigo, e quando abro o arquivo no navegador ele aparece a tela mas com erros dizendo:
Notice: Undefined index: verOK in C:\sites\cpf_verifica.php on line 3
e
Notice: Undefined index: verOK in C:\sites\cpf_verifica.php on line 91

mesmo assim, ele consegue verificar normalmente o cpf, mas como posso tirar essa mensagem de erro que aparece?

 Marcos Dill
19/11/2004 18h03

Broken link No Clique Aqui

nao existe o arquivo
http://www.imasters.com.br/web/colunistas/php/79/php_artigo79.zip

 FelipeTv
04/04/2005 20h32

como fazer isso em VB?

ME AJUDE.. PRECISO D FAZER ISSO EM VISUAL BASIC. NET?

 erivelto carvalho
29/09/2005 11h50

cpf invalido

o script está rodando normalmente o problema é que só aparece a mensagem de CPF inválido em todos os cpf's que digito.help please.

 matheus coxa
02/10/2005 15h59

como faze isso em pascal?

como faço o calculo do cpf usando o programa pascal?
tenho um trabalho a entregar com urgencia.
se puder me ajudar me responda.

obrigado desde já.

matheus

 Diego Botelho Martins
01/06/2007 15h14

Melhorias

Júlio teu script está show, postei aí algumas adaptações e melhorias fiz sobre ele... Abraço

public function validarCPF($strCPF)
{
try
{
// Retira . e - do CPF:
$strCPF = str_replace(".","", $strCPF);
$strCPF = str_replace("-","", $strCPF);

// Verifica se o CPF é constituído de números repetidos de 11111111111 até 99999999999
for($i = 0; $i <= 9; $i )
{
$strRepetido = "";
if($strCPF == str_pad($strRepetido, 11, $i)) return false;
}

// Obtém o dígito verificador
$intDVInformado = substr($strCPF, 9,2);

for($i = 0; $i <= 8; $i )
{
$arDigito[$i] = substr($strCPF, $i, 1);
}

//Calcula o valor do 10º dígito de verificação
$intPosicao = 10;
$intSoma = 0;

for($i = 0; $i <= 8; $i )
{
$intSoma = $arDigito[$i] * $intPosicao;
$intPosicao = $intPosicao - 1;
}

$arDigito[9] = $intSoma % 11;
$arDigito[9] = ($arDigito[9] < 2) ? 0 : 11 - $arDigito[9];

//Calcula o valor do 11º dígito de verificação
$intPosicao = 11;
$intSoma = 0;

for($i = 0; $i <= 9; $i )
{
$intSoma = $arDigito[$i] * $intPosicao;
$intPosicao = $intPosicao - 1;
}

$arDigito[10] = $intSoma % 11;
$arDigito[10] = ($arDigito[10] < 2) ? 0 : 11 - $arDigito[10];

// Verifica se o DV calculado é igual ao informado
$intDV = $arDigito[9] * 10 $arDigito[10];

return ($intDV != $intDVInformado) ? false : true;
}
catch(Exception $e)
{
throw new ClienteException($e->getMessage());
}
}

 Jucelho Pereira
22/10/2009 15h41

ta errado

esses seus códigos não sei o que acontece!
por que quando salvo eles na pasta "hdocs" e abro com o navegador
os códigos php aparecem!
você deve estar esquecendo alguma coisa!
se é para ensinar tente fazer isso direito por favor!
isso é sobre a apostila
"cadastro de clientes"
se você conseguir ajeita-la me manda
por email por favor

Cancelar resposta

Qual a sua opinião?

Faça login abaixo ou cadastre-se rapidamente.


Sobre o Autor
Júlio César Martini atualmente presta serviços de WebMaster/Programador para o UOL (http://www.uol.com.br), Graduado em Tecnólogo em Informática pela UNIFIAN - Faculdades Anhanguera e Pós-Graduado em Desenvolvimento de Software para Web pela UFSCAR. Foi o primeiro profissional a chegar à marca de 100 artigos publicados no iMasters e trabalha com PHP desde 2000. Site: http://www.juliocesarmartini.com

2001 - iMasters FFPA Informática Ltda - Todos os direitos reservados.