Ir para conteúdo

POWERED BY:

Arquivado

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

Jonatã Cioni

Classe para Validação de CPF

Recommended Posts

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>

Compartilhar este post


Link para o post
Compartilhar em outros sites

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?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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";
                               }                               
                       }
               }
       }
}
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

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.