Hoje vou mostrar pra vocês como funciona um contador de visitas bem simples usando MySQL.
Esse contador salva no banco de dados as visitas únicas (uniques) e as visualizações de páginas (pageviews) de cada dia. No script também vem uma função que você pode usar para pegar os totais de cada tipo de visitas filtrando por períodos!
Antes de tudo, rode esse código SQL no banco de dados do seu site para criar a tabela que o sistema usa:
DROP TABLE IF EXISTS `visitas`; CREATE TABLE IF NOT EXISTS `visitas` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `data` date NOT NULL, `uniques` int(10) unsigned NOT NULL DEFAULT '0', `pageviews` int(10) unsigned NOT NULL DEFAULT '0', PRIMARY KEY (`id`), UNIQUE KEY `data` (`data`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
Agora copie o código desse script PHP e salve-o como contadorVisitas.php em algum diretório do seu site:
/**
* Sistema de contador de visitas
*
* Usado para fazer a contagem de visitas únicas e pageviews diários do site
*
* Método de utilização:
* Apenas inclua este arquivo no começo do seu site.
*
* @author Thiago Belem <contato@thiagobelem.net>
* @link http://thiagobelem.net/
*
* @version 1.0
* @package ContadorVisitas
*/
// Configurações do Script
// ==============================
$_CV['registraAuto'] = true; // Registra as visitas automaticamente?
$_CV['conectaMySQL'] = true; // Abre uma conexão com o servidor MySQL?
$_CV['iniciaSessao'] = true; // Inicia a sessão com um session_start()?
$_CV['servidor'] = 'localhost'; // Servidor MySQL
$_CV['usuario'] = 'root'; // Usuário MySQL
$_CV['senha'] = ''; // Senha MySQL
$_CV['banco'] = 'test'; // Banco de dados MySQL
$_CV['tabela'] = 'visitas'; // Nome da tabela onde os dados são salvos
// ==============================
// ======================================
// ~ Não edite a partir deste ponto ~
// ======================================
// Verifica se precisa fazer a conexão com o MySQL
if ($_CV['conectaMySQL'] == true) {
$_CV['link'] = mysql_connect($_CV['servidor'], $_CV['usuario'], $_CV['senha']) or die("MySQL: Não foi possível conectar-se ao servidor [".$_CV['servidor']."].");
mysql_select_db($_CV['banco'], $_CV['link']) or die("MySQL: Não foi possível conectar-se ao banco de dados [".$_CV['banco']."].");
}
// Verifica se precisa iniciar a sessão
if ($_CV['iniciaSessao'] == true) {
session_start();
}
/**
* Registra uma visita e/ou pageview para o visitante
*/
function registraVisita() {
global $_CV;
$sql = "SELECT COUNT(*) FROM `".$_CV['tabela']."` WHERE `data` = CURDATE()";
$query = mysql_query($sql);
$resultado = mysql_fetch_row($query);
// Verifica se é uma visita (do visitante)
$nova = (!isset($_SESSION['ContadorVisitas'])) ? true : false;
// Verifica se já existe registro para o dia
if ($resultado[0] == 0) {
$sql = "INSERT INTO `".$_CV['tabela']."` VALUES (NULL, CURDATE(), 1, 1)";
} else {
if ($nova == true) {
$sql = "UPDATE `".$_CV['tabela']."` SET `uniques` = (`uniques` + 1), `pageviews` = (`pageviews` + 1) WHERE `data` = CURDATE()";
} else {
$sql = "UPDATE `".$_CV['tabela']."` SET `pageviews` = (`pageviews` + 1) WHERE `data` = CURDATE()";
}
}
// Registra a visita
mysql_query($sql);
// Cria uma variavel na sessão
$_SESSION['ContadorVisitas'] = md5(time());
}
/**
* Função que retorna o total de visitas
*
* @param string $tipo - O tipo de visitas a se pegar: (uniques|pageviews)
* @param string $periodo - O período das visitas: (hoje|mes|ano)
*
* @return int - Total de visitas do tipo no período
*/
function pegaVisitas($tipo = 'uniques', $periodo = 'hoje') {
global $_CV;
switch($tipo) {
default:
case 'uniques':
$campo = 'uniques';
break;
case 'pageviews':
$campo = 'pageviews';
break;
}
switch($periodo) {
default:
case 'hoje':
$busca = "`data` = CURDATE()";
break;
case 'mes':
$busca = "`data` BETWEEN DATE_FORMAT(CURDATE(), '%Y-%m-01') AND LAST_DAY(CURDATE())";
break;
case 'ano':
$busca = "`data` BETWEEN DATE_FORMAT(CURDATE(), '%Y-01-01') AND DATE_FORMAT(CURDATE(), '%Y-12-31')";
break;
}
// Faz a consulta no MySQL em função dos argumentos
$sql = "SELECT SUM(`".$campo."`) FROM `".$_CV['tabela']."` WHERE ".$busca;
$query = mysql_query($sql);
$resultado = mysql_fetch_row($query);
// Retorna o valor encontrado ou zero
return (!empty($resultado)) ? (int)$resultado[0] : 0;
}
if ($_CV['registraAuto'] == true) { registraVisita(); }
Pronto, você já tem a tabela no banco e o script dentro do site, agora é só abrir o script e configurar a conexão do MySQL e/ou desativá-la se necessário. Todas as opções estão com comentários explicativos… Depois disso é só incluir o script no topo do seu site (antes de tudo) que ele já vai começar a contar as visitas pra você.
Quando você quiser pegar o total de visitas é só usar um desses exemplos:
// Pega o total de visitas únicas de hoje
$total = pegaVisitas();
// Pega o total de visitas únicas desde o começo do mês
$total = pegaVisitas('uniques', 'mes');
// Pega o total de visitas únicas desde o começo do ano
$total = pegaVisitas('uniques', 'ano');
// Pega o total de pageviews de hoje
$total = pegaVisitas('pageviews');
// Pega o total de pageviews desde o começo do mês
$total = pegaVisitas('pageviews', 'mes');
// Pega o total de pageviews desde o começo do ano
$total = pegaVisitas('pageviews', 'ano');
Espero que tenham gostado!
![]()
Você também vai gostar de ler:
- Contador de visitantes online em PHP e MySQL
- Criando um sistema de login com PHP e MySQL
- Usando o MySQLi Orientado a Objetos
- Sistema de busca em PHP e MySQL com paginação
- Como criar um Sistema de Login com Níveis de Permissão
Postado em MySQL, PHP, Tutoriais
Com as tags Banco de Dados, Busca, Código, comentários, Conexão, Contador, DIE, empty, INSERT, Lua, MySQL, PHP, Root, Scripts, Senha, Servidor, Sessão, Session, Sistema, SQL, Visitas
Escrito por Thiago Belem
Gostou desse artigo?
Não se esqueça de assinar o RSS e divulgue-o para o mundo:
consegui imprimir, a duvida agora é que terei que mostrar as visitas
dentro do painel de controle e nao na frente do site, porem terei de contabilizar
as informações que em da pagina inicial do site, como que faço?
Cara nao consigo imprimir os valores, desculpe a dúvida ser tão idiota,
é q nao estou conseguindo
Eai Thiago parabens você comanda..
Uma duvida, posso usar todas esses codigos numa vez só?
// Pega o total de visitas únicas de hoje
$total = pegaVisitas();
// Pega o total de visitas únicas desde o começo do mês
$total = pegaVisitas(‘uniques’, ‘mes’);
// Pega o total de visitas únicas desde o começo do ano
$total = pegaVisitas(‘uniques’, ‘ano’);
// Pega o total de pageviews de hoje
$total = pegaVisitas(‘pageviews’);
// Pega o total de pageviews desde o começo do mês
$total = pegaVisitas(‘pageviews’, ‘mes’);
// Pega o total de pageviews desde o começo do ano
$total = pegaVisitas(‘pageviews’, ‘ano’);
@Allan
Pode sim, sem problemas.
Precisa dizer mais alguma coisa?!
posso usar esse script com include?
@Rafel
Pode sim..
Obrigada pela ajuda Thiago… mas será que teria como o ip ser renovado a cada 30min em vez de 24 horas. Como faria isso?
@Jenifer
Teria que modificar todo o script…
Como faço para mostrar o total de visitantes no site? Sou meio inciante no php e não sei como fazer isso com o seu código. Obrigada
@Jenifer
Você precisaria modificar o script, adicionando mais um case:
case 'total': $busca = '1 = 1'; break;E depois usar :
$total = pegaVisitas('pageviews', 'total');Cara.. curti demais o seu script.. vou usar boas partes =)
Obrigado
Bom dia Thiago Belem,
O Tutorial de Contador de Visitas ficou muito bom, esta de parabéns, eu gostaria de tirar uma dúvida.
Tem como colocar para que o contador somente conte uma visita por dia, pois tipo se fechar e abrir o navegador ele conta como se fosse uma nova visita, fazer tipo uma restrição que se aquele IP ja tiver acesso naquele dia não contar como visita comparando as datas, se ele acessou hoje e tentar novamente, ele verifica se aquele IP ja tem acesso naquele dia e se tive não conta.
Parabenizo novamente pelo Ótimo Tutorial.
@Diego

Obrigado pelo comentário e pelo elogio!
O script faz exatamente isso que você tá querendo… Ele tem 2 tipos de contadores: visitas e pageview. As vistas são unicas por dia e os pageviews são cada carregamento de página que os visitantes dão. A única diferença é que o sistema tá baseado em sessão e não em cookies (que permanecem depois que o navegador fecha).. Caso queira mudar para cookies você vai precisar alterar as linhas 57 e 73 apenas.
Ele não precisa do uniques e hoje pq na funcao está pegaVisitas($tipo = ‘uniques’, $periodo = ‘hoje’), ou seja se não receber nenhum valor ele pega uniques e hoje como valor.
Nossa… tudo isso junto? ^^ perfeito xD
Eu tinha pego um script para contar visitas mas não tinha entendido ele, além dele não possuir todas essas possiblidades =]
Só uma dúvida: Porque o “$total = pegaVisitas();” não precisa do ” ‘uniques’ ” ?
Obrigado!