Contador de Visitas com Validação de Usuário por IP
04/04/2018Nessa vídeo-aula vamos aprender como fazer um contador de visitas no nosso site, verificando o IP, data e hora de acesso do usuário, evitando assim visitas repetitivas do mesmo usuário.
Para criar esse sistema vamos precisar de 3 arquivos (index.php, ClassConexao.php e ClassVisitas.php). Além disso, precisamos criar o banco de dados.
Criando banco de dados de contagem de visitas
Criaremos nosso banco de dados com 4 colunas.
CREATE TABLE 'visitas' (
'Id' int(11) NOT NULL,
'Ip' varchar(30) NOT NULL,
'Data' varchar(30) NOT NULL,
'Hora' varchar(30) NOT NULL
);
ALTER TABLE 'visitas' ADD PRIMARY KEY ('Id');
ALTER TABLE 'visitas' MODIFY 'Id' int(11) NOT NULL AUTO_INCREMENT;
Criando a conexão com o banco de dados
Para a conexão com o banco de dados mysql utilizaremos o PDO. A classe será abstract para que fique mais segura, podendo ser apenas extendida.
abstract class ClassConexao{
public function Conectar()
{
try{
$Con=new PDO("mysql:host=localhost;dbname=sistema","root","");
return $Con;
}catch (PDOException $Erro){
return $Erro->getMessage();
}
}
}
Criando a verificação do usuário e inserção da visita no banco
Na classe abaixo realizaremos a verificação do usuário no banco, testando primeiramente se naquela data o ip dele está inserido. Caso não esteja já faremos a inserção imediata, caso esteja faremos um segundo teste verificando se a hora atual menos a hora da última visita dele são maiores que o horário limite que desejamos (por exemplo uma hora) e caso seja maior faremos a inserção no banco.
Fazendo essas verificações evitamos que o mesmo usuário some diversas visitas de uma só vez.
include ("ClassConexao.php");
class ClassVisitas extends ClassConexao{
private $Id, $Ip , $Data , $Hora , $Limite;
#Construtor para setar atributos
public function __construct()
{
$this->Id=0;
$this->Ip=$_SERVER['REMOTE_ADDR'];
$this->Data=date("Y/m/d");
$this->Hora=date("H:i");
$this->Limite=50;
}
#Verifica se o usuário recebeu visita recentemente
public function VerificaUsuario()
{
$Select=$this->Conectar()->prepare("select * from visitas where Ip=:ip and Data=:datas order by Id desc");
$Select->bindParam(":ip",$this->Ip,PDO::PARAM_STR);
$Select->bindParam(":datas",$this->Data,PDO::PARAM_STR);
$Select->execute();
if($Select->rowCount() == 0){
$this->InserindoVisitas();
}else{
$FSelect=$Select->fetch(PDO::FETCH_ASSOC);
$HoraDB=strtotime($FSelect['Hora']);
$HoraAtual=strtotime($this->Hora);
$HoraSubtracao=$HoraAtual-$HoraDB;
if($HoraSubtracao > $this->Limite){
$this->InserindoVisitas();
}
}
echo "Visitantes no site: ".$Select->rowCount()."
";
}
#Inseri a visita no banco de dados
private function InserindoVisitas()
{
$Select=$this->Conectar()->prepare("insert into visitas values (:id , :ip , :datas , :hora)");
$Select->bindParam(":id",$this->Id,PDO::PARAM_STR);
$Select->bindParam(":ip",$this->Ip,PDO::PARAM_STR);
$Select->bindParam(":datas",$this->Data,PDO::PARAM_STR);
$Select->bindParam(":hora",$this->Hora,PDO::PARAM_STR);
$Select->execute();
}
}