Adicionem o novo domínio do blog aos seus favoritos! www.crashcomputer.com.br

   domingo, 20 de outubro de 2013

Contador de visualisações de página ULTRA SIMPLES!



1 Star2 Stars3 Stars4 Stars5 Stars (Nenhum voto, seja o primeiro!)
Loading...

Uma coisa que eu procurei a rodo e não achava nada super simples como eu precisava, era um contador de visualizações de páginas (pageview).

Todos que achava coletavam informações demais que não me interessavam, eu queria que somente registrasse o numero de acessos a nada mais. Porque isso? Bom… eu já usava um contador de visualizações próprio, que realizava o armazenamento em um arquivo texto, porem isso funciona bem desde que não haja muito tráfego, com tráfego excessivo, é muito comum perder, o conteúdo do arquivo texto e zerar o contador.

Então, a melhor coisa é delegar isso ao MySQL e deixar que ele se vire com a fila de acessos.

Como não achei nada pronto que me servia, qual a solução? Arregaçar as mangas e fazer um por conta própria. :D

Segue o código abaixo.

<php
  // Conexão com o Banco de Dados
  mysql_connect("host", "user", "pass") or die ('Não foi possível conectar: '.mysql_error())

  // Seleciona o Banco de Dados
  mysql_select_db("pageview_counter") or die ('A consulta falhou: '.mysql_error());

  // Verifica se a tabela não existe, e cria uma.
  $sql = "create table if not exists counter (
    pageview int(11) not null,
    primary key (pageview)
  )";

  mysql_query($sql) or die ('Erro ao criar tabela: '.mysql_error());

  $strSQL = "select * from counter";

  $rs = mysql_query($strSQL) or die ('Erro ao selecionar tabela: '.mysql_error());

  // Se a tabela está vazia, cria o contador.
  if (mysql_num_rows($rs) == 0 ) {
    $strSQL = "insert into counter(";
    $strSQL = $strSQL . "pageview) ";

    $strSQL = $strSQL . "values(";
    $strSQL = $strSQL . "'1') ";

    mysql_query($strSQL) or die ('Erro ao criar tabela: '.mysql_error());
  }

  // Atualiza o contador no banco de dados.
  $strSQL = "update counter set pageview = pageview + 1";

  mysql_query($strSQL) or die ('Erro ao gravar tabela: '.mysql_error());

  // Pega o valor corrente do contador.
  $count = mysql_fetch_array($rs);
  $count = str_pad($count["pageview"], 5, "0", str_pad_left);
  // Nesta linha abaixo é feita a exibição do contador, formate ao seu gosto.
  echo "<span class=\"counter\">PageView: ".$count."</span>";

  mysql_close ();
?>

Para utilizar é simples. Você deve criar um usuário, senha e um banco de dados no seu painel de controles.

Na linha 3, coloque os dados de acesso ao banco de dados.

Na linha 6, é o nome do banco de dados. Você pode utilizar um banco de dados já existente, pois somente será criada uma tabela com o nome de “counter”. Neste caso altere o nome “pageview_counter”.

O restante o script já faz sozinho.

Se quiser alterar a quantidade de zeros que o script coloca automaticamente a esquerda do contador, altere o valor “5” na linha 38. Do jeito que está será exibido um número de 5 dígitos.

Na linha 40 é exibido o valor da contagem. Existe também uma classe “counter” que você pode utilizar para formatar o texto do contador via CSS ao seu gosto. :-P

Para usar é hyper-simples. Salve o código com um nome qualquer (sugestão: counter.php).

Insira em sua página usando a função include do PHP:

<!--?php include 'counter.php'; ?-->

E… voilá!

O código é meio macarrônico, mas funciona, faz o básico necessário e que eu precisava e não achei, feito de uma forma tão simples.

Daria pra fazer de uma forma mais elegante? Certamente que sim! Mas como eu ainda sou aprendiz de MySQL, tá valendo. :sarcastic:



  Seguir comentários via RSS

4 thoughts on “Contador de visualisações de página ULTRA SIMPLES!

  1. JP disse:
    Usando Mozilla Firefox Mozilla Firefox 24.0 - Linux Linux

    Legal, simples e prático!

    Comentários de JP: 10

  2. Usando Google Chrome Google Chrome 29.0.1547.66 - Windows Windows 7

    mas ai você tem um problema, que se um usuário ficar dando Reload na página vai contabilizar cada acesso.

    Eu fiz um contador um pouco mais completo para meu site que também armazena no MySQL, porém em Shell Script, se quiser tirar alguma ideia:
    – Como meu site andava tendo muitas visitas de robots eu criei um arquivo com estes IPs, então visitas de robots são armazenadas em outro contador;
    – O script contabiliza uma visita por IP por dia por página, então mesmo o usuário recarregando a página várias vezes só vai contabilizar uma visita em cada página do site;
    – Fiz um segundo script a parte que roda de hora em hora e baixa a geolocalização dos visitantes e atualiza no banco de dados, fiz isto pois anuncio no Adwords e queria ter certeza se estava recebendo as visitas das pessoas certas;
    – Em paralelo a isso fiz também em CGI uma espécie de “CGI MyAdmin”, para visualizar e gerenciar os dados dos contadores.

    (Esta parte do código fica no início do script CGI):
    #Variáveis para mostrar contador de visitas
    CONTADOR=”`/usr/bin/mysql -vv -u daniel webloja -e “select count(*) from contador group by date(datetime), ip” | grep row | cut -f 1 -d’ ‘`”
    CONTADORHOJE=”`/usr/bin/mysql -vv -u daniel webloja -e “select count(*) from contador where date(datetime) = curdate() group by ip” | grep row | cut -f 1 -d’ ‘`”

    (Esta parte do código exibe o contador na página)
    echo ” Visitas: $CONTADOR

    (Esta parte do código fica no final do script):
    ##>>CONTADOR
    IFS=”$(echo -e ‘\t’)” #Separador padrão

    #Se este Range de IP NÂO estiver na Whitelist passa para o contador
    RANGE=”`echo $REMOTE_ADDR | cut -f 1-2 -d.`”
    if [ -z “`grep “^$RANGE$” /partition/webloja/whitelist`” ]; then

    #Se este IP NÃO teve visitas hoje NESTA página, então registra no contador
    if [ -z “`/usr/bin/mysql -u $DBUSER webloja -e “select * from contador where IP = ‘$REMOTE_ADDR’ and date(datetime) = curdate() and local = ‘$REDIRECT_QUERY_STRING'”`” ]; then
    /usr/bin/mysql -u $DBUSER webloja -e “insert into contador (IP, datetime, local) values (‘$REMOTE_ADDR’,NOW(),’$REDIRECT_QUERY_STRING’)” 1>/dev/null 2>&1

    #Se já tiver localização anterior deste IP no DB já salva nesta linha
    /usr/bin/mysql -u $DBUSER webloja -e “select ISP, City, Region, Country from contador where IP = ‘$REMOTE_ADDR’ and Country IS NOT NULL limit 1” | sed ‘1d’ | while read ISP CITY REGION COUNTRY; do
    [ “$ISP” -a “$CITY” -a “$REGION” -a “COUNTRY” ] && /usr/bin/mysql -u $DBUSER webloja -e “update contador set ISP = ‘$ISP’, City = ‘$CITY’, Region = ‘$REGION’, Country = ‘$COUNTRY’ where IP = ‘$REMOTE_ADDR'” 1>/dev/null 2>&1
    done
    fi

    #Se Range de IP estiver na Whitelist, conta na tabela Robos
    else
    #Se este IP NÃO teve visitas hoje NESTA página, então registra no contador
    if [ -z “`/usr/bin/mysql -u $DBUSER webloja -e “select * from robos where IP = ‘$REMOTE_ADDR’ and date(datetime) = curdate() and local = ‘$REDIRECT_QUERY_STRING'”`” ]; then
    /usr/bin/mysql -u $DBUSER webloja -e “insert into robos (IP, datetime, local) values (‘$REMOTE_ADDR’,NOW(),’$REDIRECT_QUERY_STRING’)” 1>/dev/null 2>&1

    #Se já tiver localização anterior deste IP no DB já salva nesta linha
    /usr/bin/mysql -u $DBUSER webloja -e “select ISP, City, Region, Country from robos where IP = ‘$REMOTE_ADDR’ and Country IS NOT NULL limit 1” | sed ‘1d’ | while read ISP CITY REGION COUNTRY; do
    [ “$ISP” -a “$CITY” -a “$REGION” -a “COUNTRY” ] && /usr/bin/mysql -u $DBUSER webloja -e “update robos set ISP = ‘$ISP’, City = ‘$CITY’, Region = ‘$REGION’, Country = ‘$COUNTRY’ where IP = ‘$REMOTE_ADDR'” 1>/dev/null 2>&1
    done
    fi
    fi
    ##<<

    (Este é o script getlocalip.sh, que é executado no Cron a cada hora ou manualmente, passando o nome do DB pela entrada STDIN (ex. ./getlocalip.sh contador))
    #!/bin/sh
    #geolocalip.sh – Capturar localização do IP dos visitantes do contador
    #daniel.uramg 06/11/12

    #Tabela a pesquisar
    TABELA="$1"
    DBUSER="daniel"

    #Arquivo temporário para armazenar os dados a inserir no DB
    FILE="/partition/tmp/$1.tmp"

    [ -z "$1" ] && echo "Uso: $0 'tabela'" && exit

    #Chama o gerenciador do MySQL
    SQL="mysql -u $DBUSER webloja"

    #Remove o arquivo temporário anterior
    [ -e "$FILE" ] && rm $FILE

    HORA=`date +%H:%M:%S`
    echo "$HORA: Iniciando script na tabela $TABELA…"

    #Seleciona todos os IPs com os dados Nulos
    $SQL -e "select distinct IP from $TABELA where ISP IS NULL and City IS NULL and Region is NULL and Country IS NULL" | sed '1d' | while read IP; do
    HORA=`date +%H:%M:%S`
    CONTA="$(($CONTA+1))"
    echo "$HORA: $CONTA – $IP"

    #Captura os dados deste IP
    IFS=:
    wget -O – https://www.iplocationfinder.com/$IP | sed -n '/<table/,/<\/table/p' | sed "s/]*>//g;s/’//g” | /usr/bin/iconv -f UTF-8 -t WINDOWS-1252 | tr -s ‘ ‘ | while read TIPO VALOR; do
    [ “$TIPO” = “IP” ] && IP=”$VALOR”
    [ “$TIPO” = “ISP” ] && ISP=”$VALOR”
    [ “$TIPO” = “City” ] && CITY=”$VALOR”
    [ “$TIPO” = “Region” ] && REGION=”$VALOR”
    [ “$TIPO” = “Country” ] && COUNTRY=”$VALOR”
    [ “$COUNTRY” ] && CONT=”$(($CONT+1))”
    #Dados coletados, salva no arquivo para ser lido pelo MySQL
    if [ “$CONT” = “1” ]; then
    [ “$COUNTRY” ] && echo “update $TABELA set ISP = ‘$ISP’, City = ‘$CITY’, Region = ‘$REGION’, Country = ‘$COUNTRY’ where IP = ‘$IP’;” | sed ‘y/áÁàÀãÃâÂéÉêÊëËíÍóÓõÕôÔúÚçÇ/aAaAaAaAeEeEeEiIoOoOoOuUcC/;s/þ/þ/g;s/Þ/Þ/g;s/ý/ý/g;s/Ý/Ý/g;s/©/©/g;s/®/®/g;s/"/”/g;s/&/&/g;s/>/>/g;s/</> $FILE
    fi
    done
    done

    #Se o arquivo temporário existir…
    if [ -e “$FILE” ]; then
    HORA=`date +%H:%M:%S`

    echo “$HORA: Dados coletados, armazenando no Banco de Dados…”

    #Chama MySQL com o arquivo
    $SQL -f desc contador;
    +———-+————–+——+—–+———+——-+
    | Field | Type | Null | Key | Default | Extra |
    +———-+————–+——+—–+———+——-+
    | IP | varchar(15) | NO | | | |
    | datetime | datetime | YES | | NULL | |
    | local | varchar(100) | YES | | NULL | |
    | ISP | varchar(80) | YES | | NULL | |
    | City | varchar(30) | YES | | NULL | |
    | Region | varchar(80) | YES | | NULL | |
    | Country | varchar(30) | YES | | NULL | |
    +———-+————–+——+—–+———+——-+
    7 rows in set (0.00 sec)

    mysql> desc robos;
    +———-+————–+——+—–+———+——-+
    | Field | Type | Null | Key | Default | Extra |
    +———-+————–+——+—–+———+——-+
    | IP | varchar(15) | NO | | | |
    | datetime | datetime | YES | | NULL | |
    | local | varchar(100) | YES | | NULL | |
    | ISP | varchar(80) | YES | | NULL | |
    | City | varchar(30) | YES | | NULL | |
    | Region | varchar(80) | YES | | NULL | |
    | Country | varchar(30) | YES | | NULL | |
    +———-+————–+——+—–+———+——-+
    7 rows in set (0.00 sec)

    Comentários de Daniel Plácido: 10

    • Avatar photo Luciano disse:
      Usando Mozilla Firefox Mozilla Firefox 12.0 - Windows Windows 2000

      Daniel, ok. Mas vamos a um pequeno detalhe que eu acho que você não entendeu. Eu vejo a coisa sob duas óticas: Contador de Visitas é diferente de Contador de Páginas.

      Contador de visitas: Registra uma contagem por IP independente de quantas paginas são visitadas ou de quantos reloads, em um período de tempo, em geral, a cada 24 horas.

      Contador de páginas: Registra a quantidade de visualizações, ou quantas vezes a pagina foi carregada.

      No meu caso eu queria justamente um contador de páginas! E foi isso que eu disse com o “coletar informações desnecessárias a meus propósitos”.

      Sobre transformar esse contador simples em algo mais sofisticado, isso eu já fiz, e será assunto para outros dois post. Cada um deles abordado o rumo diferente que essa idéia tomou. Tanto que originam mais dois scripts muito mais completos. o:-)

      Comentários de Luciano: 479

  3. André Ribeiro disse:
    Usando Mozilla Firefox Mozilla Firefox 24.0 - Windows Windows 7

    Luciano e Daniel, muito bons os scripts…

    Comentário de André Ribeiro: 1

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

 

:D :tooth: :mrgreen: :-P :-)) (lol) .:lol:. o:-) 8-) :-$ :-| }:D :-/ -_- |-/ :X.: =X 8|( :xxx :furious: :-o* X-P 8x :censored: *~O more »


1) Os comentários são moderados.
2) Comentários que não sejam referentes ao assunto do post serão excluídos.
3) Eu posso editar seu comentário antes de publicar, se o achar necessário.
  Melhor visualizado a
1024 x 768 True color
Proudly powered by WordPress. Theme developed with WordPress Theme Generator.
E altamente gambiarrado por mim mesmo :)
Copyright © 2010 by Crash Computer. All rights reserved.