PHP

Validação de CPF usando PHP

PorJúlio César Martini em

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!

Deixe um comentário! 14

14 comentários

Comentários

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Comentando como Anônimo

  1. 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?

  2. 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

  3. 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] getMessage());
    }
    }

  4. 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

  5. Em resposta ao Jucelho Pereira:
    Eu sei que o post dele é meio antigo, mas até hoje existem pessoas lendo esse artigo, então resolvi comentar:

    O código até que está bom, para fins de demonstração da técnica de validação do cpf pelo menos está suficientemente bom. O Jucelho não deve ter instalado corretamente o servidor Apache (ou qualquer outro) corretamente, junto com o PHP, por isso o código aparece na tela, o PHP é interpretado (caso haja um interpretador caso contrário ele é só um arquivo de texto plano que o navegador enxerga como tal), não é compilado. Quem tiver dúvidas procure se informar antes para verificar se não está cometendo gafes, como essa por exemplo:
    “se é para ensinar tente fazer isso direito por favor!”
    Desculpe, mas o Júlio César fez a parte dele…

  6. Não existem uma maneira mais resumida de fazer isso não? Inclusive para verificar a repetição de números.
    (Bom, sei que isso não é comentário, é uma pergunta, por isso já se estima que não haja resposta mesmo tendo a opção responder).

    Se isso for possivel, por favor publlique pois a demonstração de seu script é boa, mas acho que poderia aperfeiçoá-la.

    Obs.: Quanto ao figura do “Jucelho Pereira” postando “ano passado” isso sempre acontece com quem não consegue nem instalar e configurar o WAMP (ou semelhantes). Noob! =)

    Grande abraço!

  7. function is_a_valid_cpf($cpf) {
    $cpf = preg_replace(‘/[^0-9]/’,”,$cpf);

    if(strlen($cpf) < 11 || preg_match('/^([0-9])\1+$/', $cpf)) {
    return false;
    }

    // 9 primeiros digitos do cpf
    $digit = substr($cpf, 0, 9);

    // calculo dos 2 digitos verificadores
    for($j=10; $j <= 11; $j++){
    $sum = 0;
    for($i=0; $i< $j-1; $i++) {
    $sum += ($j-$i) * ((int) $digit[$i]);
    }

    $summod11 = $sum % 11;
    $digit[$j-1] = $summod11 < 2 ? 0 : 11 - $summod11;
    }

    return $digit[9] == ((int)$cpf[9]) && $digit[10] == ((int)$cpf[10]);
    }

    1. Pessoal,

      Errata para versão acima!!

      CPF tem que ter 11 dígitos!

      function is_a_valid_cpf($cpf)
      {
      $cpf = preg_replace(‘/[^0-9]/’,”,$cpf);

      if(strlen($cpf) != 11 || preg_match(‘/^([0-9])\1+$/’, $cpf)) {
      return false;
      }

      // 9 primeiros digitos do cpf
      $digit = substr($cpf, 0, 9);

      // calculo dos 2 digitos verificadores
      for($j=10; $j <= 11; $j++){
      $sum = 0;
      for($i=0; $i< $j-1; $i++) {
      $sum += ($j-$i) * ((int) $digit[$i]);
      }

      $summod11 = $sum % 11;
      $digit[$j-1] = $summod11 < 2 ? 0 : 11 - $summod11;
      }

      return $digit[9] == ((int)$cpf[9]) && $digit[10] == ((int)$cpf[10]);
      }

leia mais
Este projeto é mantido e patrocinado pelas empresas: