Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
bom... postando Classe de Validação de CPF novamente, sendo corrigido alguns erros de validação...^^
Classe:
<?php
class validaDocumentos{
protected $digA, $digB, $digC, $digD, $digE, $digF, $digG, $digH, $digI, $digJ, $digK;
protected $multDigJcpf, $vDigJcpf, $multDigKcpf, $vDigKcpf;
public $regiaoCPF;
public function validaCPF($cpf){
//Primeiro verifica-se se a variavel $cpf não esta vazia
if(empty($cpf)){
//Se estiver, retorna um erro
return "Você tem que digitar um numero de CPF";
//Se não estiver vazia, verifica se foi digitado somente numeros
}else if(!is_numeric($cpf)){
//Se não tiver somente numeros, retorna um erro
return "Você só pode digitar numeros";
//Se foi digitad somente numeros, verifica o tamanho, que por padrão, o CPF tem 11 numeros
}else if(is_float($cpf)){
return "Você só pode digitar numeros INTEIROS";
}else if($cpf < 0){
return "você só pode colocar numeros POSITIVOS";
}else if(strlen($cpf) != 11){
//Se for diferente de 11, retorna outro erro
return "O CPF digitado esta incompleto ou contém numeros demais";
//Se todos os quesitos anteriores forem obedecidos
}else{
//Se separa todos os digitos do CPF digitado
$this->digA = substr($cpf,0,1);
$this->digB = substr($cpf,1,1);
$this->digC = substr($cpf,2,1);
$this->digD = substr($cpf,3,1);
$this->digE = substr($cpf,4,1);
$this->digF = substr($cpf,5,1);
$this->digG = substr($cpf,6,1);
$this->digH = substr($cpf,7,1);
$this->digI = substr($cpf,8,1);
$this->digJ = substr($cpf,9,1);
$this->digK = substr($cpf,10,1);
if($this->digA == $this->digB and $this->digB == $this->digC and $this->digC == $this->digD and $this->digD == $this->digE and $this->digE == $this->digF and $this->digF == $this->digG and $this->digG == $this->digH and $this->digH = $this->digI){
return "Um CPF não pode ter todos os digitos iguais";
}else if(($this->digA + $this->digB + $this->digC + $this->digD + $this->digE + $this->digF + $this->digG + $this->digH + $this->digI) == 0){
return "Um CPF não pode conter somente 0";
}else{
$this->multDigJcpf = ($this->digA * 10) + ($this->digB * 9) + ($this->digC * 8) + ($this->digD * 7) + ($this->digE * 6) + ($this->digF * 5) + ($this->digG * 4) + ($this->digH * 3) + ($this->digI * 2);
if($this->multDigJcpf % 11 == 0 or $this->multDigJcpf % 11 == 1){
$this->vDigJ = 0;
}else if($this->multDigJcpf % 11 >= 2 and $this->multDigJcpf % 11 <= 10){
$this->vDigJ = 11 - ($this->multDigJcpf % 11);
}
$this->multDigKcpf = ($this->digA * 11) + ($this->digB * 10) + ($this->digC * 9) + ($this->digD * 8) + ($this->digE * 7) + ($this->digF * 6) + ($this->digG * 5) + ($this->digH * 4) + ($this->digI * 3) + ($this->digJ * 2);
if($this->multDigKcpf % 11 == 0 or $this->multDigKcpf % 11 == 1){
$this->vDigK = 0;
}else if($this->multDigKcpf % 11 >= 2 and $this->multDigKcpf % 11 <= 10){
$this->vDigK = 11 - ($this->multDigKcpf % 11);
}
if($this->digJ == $this->vDigJ && $this->digK == $this->vDigK){
if($this->digI == 1){
$this->regiaoCPF = "Possiveis Regiões em que seu CPF foi emitido: DF-GO-MS-MT-TO";
}else if($this->digI == 2){
$this->regiaoCPF = "Possiveis Regiões em que seu CPF foi emitido: AC-AM-AP-PA-RO-RR";
}else if($this->digI == 3){
$this->regiaoCPF = "Possiveis Regiões em que seu CPF foi emitido: CE-MA-PI";
}else if($this->digI == 4){
$this->regiaoCPF = "Possiveis Regiões em que seu CPF foi emitido: AL-PB-PE-RN";
}else if($this->digI == 5){
$this->regiaoCPF = "Possiveis Regiões em que seu CPF foi emitido: BA-SE";
}else if($this->digI == 6){
$this->regiaoCPF = "Possiveis Regiões em que seu CPF foi emitido: MG";
}else if($this->digI == 7){
$this->regiaoCPF = "Possiveis Regiões em que seu CPF foi emitido: ES-RJ";
}else if($this->digI == 8){
$this->regiaoCPF = "Possiveis Regiões em que seu CPF foi emitido: SP";
}else if($this->digI == 9){
$this->regiaoCPF = "Possiveis Regiões em que seu CPF foi emitido: PR-SC";
}else if($this->digI == 0){
$this->regiaoCPF = "Possiveis Regiões em que seu CPF foi emitido: RS";
}
return "CPF Válido. ".$this->regiaoCPF;
}else{
return "CPF Inválido";
}
}
}
}
}
?>
Como usar:
<?php
include("classes/validaDocumentos.php");
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>
<body>
<form id="form1" name="form1" method="post" action="?acao=validacpf">
<label for="cpf"></label>
<input name="cpf" type="text" id="cpf" maxlength="11" />
<input type="submit" name="button1" id="button1" value="Validar CPF>>" />
</form>
<?php
$pegaCPF = $_POST['cpf'];
$pegaRgRJ = $_POST['rgrj'];
$pegaRgSP = $_POST['rgsp'];
if($_GET['acao'] == "validacpf"){
$verificaCPF = new validaDocumentos;
$verificaCPF = $verificaCPF->validaCPF($pegaCPF);
echo $verificaCPF;
}
?>
</body>
</html>>
beleza!
Mas ainda acho que seria melhor usar is_int() no lugar de is_numeric() -- pois is_numeric() bate qualquer tipo de número, até mesmo hexadecimal e ponto flutuante.
Pergunta:
Onde você achou as informações sobre os padrões dos números de CPF, poderia passar algum link?
brother... não adianta... testei a função is_nan(),mais da na msma... não sei pq... foi cm lhe falei na msg que lhe mandei... nem a função is_float() tah funcionando, não sei pq...
Classe totalmente corrigida... não aceita mais ponto, ão aceita mais todos os numeCPF's validos e pra validar, tem que digitar sem "." e "-"...
Classe:
<?php
class validaDocumentos{
protected $digA, $digB, $digC, $digD, $digE, $digF, $digG, $digH, $digI, $digJ, $digK;
protected $multDigJcpf, $vDigJcpf, $multDigKcpf, $vDigKcpf;
public $regiaoCPF;
public function validaCPF($cpf){
//Primeiro verifica-se se a variavel $cpf não esta vazia
if(empty($cpf)){
//Se estiver, retorna um erro
return "Você tem que digitar um numero de CPF";
//Se não estiver vazia, verifica se foi digitado somente numeros
}else if(!is_numeric($cpf)){
//Se não tiver somente numeros, retorna um erro
return "Você só pode digitar numeros";
//Se foi digitad somente numeros, verifica o tamanho, que por padrão, o CPF tem 11 numeros
}else if(preg_match('/[(.)]/',$cpf)){
return "Você só pode digitar numeros INTEIROS";
}else if($cpf < 0){
return "você só pode colocar numeros POSITIVOS";
}else if(strlen($cpf) != 11){
//Se for diferente de 11, retorna outro erro
return "O CPF digitado esta incompleto ou contém numeros demais";
//Se todos os quesitos anteriores forem obedecidos
}else{
//Se separa todos os digitos do CPF digitado
$this->digA = substr($cpf,0,1);
$this->digB = substr($cpf,1,1);
$this->digC = substr($cpf,2,1);
$this->digD = substr($cpf,3,1);
$this->digE = substr($cpf,4,1);
$this->digF = substr($cpf,5,1);
$this->digG = substr($cpf,6,1);
$this->digH = substr($cpf,7,1);
$this->digI = substr($cpf,8,1);
$this->digJ = substr($cpf,9,1);
$this->digK = substr($cpf,10,1);
if($this->digA == $this->digB and $this->digB == $this->digC and $this->digC == $this->digD and $this->digD == $this->digE and $this->digE == $this->digF and $this->digF == $this->digG and $this->digG == $this->digH and $this->digH = $this->digI){
return "Um CPF não pode ter todos os digitos iguais";
}else if(($this->digA + $this->digB + $this->digC + $this->digD + $this->digE + $this->digF + $this->digG + $this->digH + $this->digI) == 0){
return "Um CPF não pode conter somente 0";
}else{
$this->multDigJcpf = ($this->digA * 10) + ($this->digB * 9) + ($this->digC * 8) + ($this->digD * 7) + ($this->digE * 6) + ($this->digF * 5) + ($this->digG * 4) + ($this->digH * 3) + ($this->digI * 2);
if($this->multDigJcpf % 11 == 0 or $this->multDigJcpf % 11 == 1){
$this->vDigJ = 0;
}else if($this->multDigJcpf % 11 >= 2 and $this->multDigJcpf % 11 <= 10){
$this->vDigJ = 11 - ($this->multDigJcpf % 11);
}
$this->multDigKcpf = ($this->digA * 11) + ($this->digB * 10) + ($this->digC * 9) + ($this->digD * 8) + ($this->digE * 7) + ($this->digF * 6) + ($this->digG * 5) + ($this->digH * 4) + ($this->digI * 3) + ($this->digJ * 2);
if($this->multDigKcpf % 11 == 0 or $this->multDigKcpf % 11 == 1){
$this->vDigK = 0;
}else if($this->multDigKcpf % 11 >= 2 and $this->multDigKcpf % 11 <= 10){
$this->vDigK = 11 - ($this->multDigKcpf % 11);
}
if($this->digJ == $this->vDigJ && $this->digK == $this->vDigK){
if($this->digI == 1){
$this->regiaoCPF = "Possiveis Regiões em que seu CPF foi emitido: DF-GO-MS-MT-TO";
}else if($this->digI == 2){
$this->regiaoCPF = "Possiveis Regiões em que seu CPF foi emitido: AC-AM-AP-PA-RO-RR";
}else if($this->digI == 3){
$this->regiaoCPF = "Possiveis Regiões em que seu CPF foi emitido: CE-MA-PI";
}else if($this->digI == 4){
$this->regiaoCPF = "Possiveis Regiões em que seu CPF foi emitido: AL-PB-PE-RN";
}else if($this->digI == 5){
$this->regiaoCPF = "Possiveis Regiões em que seu CPF foi emitido: BA-SE";
}else if($this->digI == 6){
$this->regiaoCPF = "Possiveis Regiões em que seu CPF foi emitido: MG";
}else if($this->digI == 7){
$this->regiaoCPF = "Possiveis Regiões em que seu CPF foi emitido: ES-RJ";
}else if($this->digI == 8){
$this->regiaoCPF = "Possiveis Regiões em que seu CPF foi emitido: SP";
}else if($this->digI == 9){
$this->regiaoCPF = "Possiveis Regiões em que seu CPF foi emitido: PR-SC";
}else if($this->digI == 0){
$this->regiaoCPF = "Possiveis Regiões em que seu CPF foi emitido: RS";
}
return "CPF Válido. ".$this->regiaoCPF;
}else{
return "CPF Inválido";
}
}
}
}
}
?>@Mário Monteiro Brigadão pelo link! Tô começando a entender melhor esse negócio...
---
@Jonatã Cioni
Dá uma olhadinha nisso aqui:
// Verifico se a string só contém números e se o tamanho dela é 11
preg_match("/([0-9]{11})/is", $cpf, $res);
if(empty($res)) {
return "CPF Inválido: Precisa conter apenas números e ter 11 dígitos";
}
// Converto a string para um array
$allNumbers = str_split($res[0]);
// Retorna um array apenas com os números únicos e o uso para contá-los
$numerosUnicos = count(array_unique($allNumbers));
// verifico se a contagem de números únicos é igual a 1, se for é
if($numerosUnicos == 1) { pq todos eram iguais
return "CPF Inválido: Não existe com todos os números iguais.";
}
$this->digA = $allNumbers[0];
$this->digB = $allNumbers[1];
$this->digC = $allNumbers[2];
$this->digD = $allNumbers[3];
$this->digE = $allNumbers[4];
$this->digF = $allNumbers[5];
$this->digG = $allNumbers[6];
$this->digH = $allNumbers[7];
$this->digI = $allNumbers[8];
$this->digJ = $allNumbers[9];
$this->digK = $allNumbers[10];
Eu acho melhor você postar as atualizações no seu código editando a postagem de abertura desse tópico, senão ele pode acabar ficando cheio de versões do mesmo código e os usuários em potencial não saberão qual usar.
Seria bom também dividir o código em duas funções, ficaria mais compreenssível, não acha? Tipo... crie uma função privativa dessa classe só para verificar se a string passada contém apenas dígitos númericos, tem 11 caracteres de comprimento e não sejam todos iguais.
>
Eu acho melhor você postar as atualizações no seu código editando a postagem de abertura desse tópico
eu tentei... mais deu msg de erro que eu não tenho acesso...
beleza!
Mas ainda acho que seria melhor usar is_int() no lugar de is_numeric() -- pois is_numeric() bate qualquer tipo de número, até mesmo hexadecimal e ponto flutuante.
Pergunta:
Onde você achou as informações sobre os padrões dos números de CPF, poderia passar algum link?