Publicidade (Anuncie Aqui)

Contador de visitas usando o MySQL

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:

Postado em MySQL, PHP, Tutoriais

Com as tags , , , , , , , , , , , , , , , , , , , , ,

Escrito por Thiago Belem

Gostou desse artigo?

Não se esqueça de assinar o RSS e divulgue-o para o mundo:

11 Comentários ou trackbacks

  1. rafael disse:

    posso usar esse script com include?

  2. Jenifer disse:

    Obrigada pela ajuda Thiago… mas será que teria como o ip ser renovado a cada 30min em vez de 24 horas. Como faria isso?

  3. Jenifer disse:

    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

    • Thiago Belem disse:

      @Jenifer
      Você precisaria modificar o script, adicionando mais um case:
      case 'total': $busca = '1 = 1'; break;

      E depois usar :
      $total = pegaVisitas('pageviews', 'total');

  4. Cara.. curti demais o seu script.. vou usar boas partes =)

    Obrigado

  5. Diego Rocha disse:

    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.

    • Thiago Belem disse:

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

  6. Moritz disse:

    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.

  7. Rodrigo Berriel disse:

    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!

Deixe um comentário

XHTML: Você pode usar essas tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Atenção: O seu comentário precisará ser aprovado antes de ser publicado

Trackbacks e Pings