LOGIN:

iMasters | Por uma internet mais criativa e dinâmica

Feeds

Terça-feira, 30/09/2003 - 01:59 - Por Júlio César Martini
Seções relacionadas:

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!

Todos os artigos de Júlio César Martini

6 comentários publicados

  • 1. Erro na linha 3 e 91

    Quinta-feira, 18/11/2004, por paulo cesar da silva moreira

    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?

    Responder comentário
  • 2. Broken link No Clique Aqui

    Sexta-feira, 19/11/2004, por Marcos Dill

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

    Responder comentário
  • 3. como fazer isso em VB?

    Segunda-feira, 04/04/2005, por FelipeTv

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

    Responder comentário
  • 4. cpf invalido

    Quinta-feira, 29/09/2005, por erivelto carvalho

    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.

    Responder comentário
  • 5. como faze isso em pascal?

    Domingo, 02/10/2005, por matheus coxa

    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

    Responder comentário
  • 6. Melhorias

    Sexta-feira, 01/06/2007, por Diego Botelho Martins

    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());
    }
    }

    Responder comentário

Poste um comentário


Os textos publicados neste espaço são de responsabilidade única de seus autores (colunistas e leitores) e podem não expressar necessariamente a opinião do iMasters.

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


Indique para um amigo

captcha

TI SHOP Produtos iMasters

  • Lançamento: CD-ROM Treinamento Aplicado de SQL - Lançamento! Treinamento Aplicado de SQL - Aprenda a trabalhar com SQL com bancos de dados Oracle e SQL Server. São mais de 100 tópicos explicados por Mauro Pichilliani, um articulistas mais lidos do iMasters. Aproveite! Apenas R$ 69,90 no TI SHOP.
  • Lançamento: Livro iMasters "O Encontro de 2 Mundos"- Este livro conta com 56 crônicas de profissionais mais admirados e influentes do mercado brasileiro de Internet. Aproveite o preço especial para leitores do iMasters. Apenas R$ 40,00 e envio imediato!
  • DVD Curso Completo de Photoshop - Do conceito à finalização Lançamento! Curso Completo de Photoshop, em DVD, com mais de 230 aulas dividas em 4 módulos: conceito, básico, avançado e finalização. Apenas R$ 69,50 no TI SHOP - Frete com 50% de desconto
  • DVD Javascript Starter - Curso Completo Com mais de 9 horas de vídeo-aulas, é um curso completo sobre Javascript. Ideal para quem deseja aprender a linguagem. Apenas R$ 64,90 no TI SHOP - Frete com 50% de desconto!

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