← Tutoriais

[PHP] Contador simples de visitas únicas

Lida 7802 vezes

Offline

=IceBurn= 
Membro
Mensagens 897 Gostos 3
Feedback +3

Troféus totais: 32
Trófeus: (Ver todos)
Windows User Level 6 Linux User Mobile User Super Combination Combination Topic Starter Poll Voter Poll Starter Level 5

Este é um contador muito simples cujo objectivo é contar visitas únicas em vez de hits, e não necessita de SQL e muito menos de cookies.
Apenas necessitamos de um ficheiro de texto para guardar os dados e o ficheiro do código propriamente dito:

Código: [Seleccione]
<?php
// IceBurn - 2006 //

session_start&#40;&#41;; /*Iniciamos a sessão*/
 
$ficheiro "contador.txt"/* O ficheiro de texto onde vamos guardar a contagem, podem colocar na root, desde que especifiquem correctamente o caminho para o mesmo */

ignore_user_abort&#40;false&#41;; /* Uma função bastante útil e que eu uso bastante, resumindo mesmo que o utilizador se "desligue" do site, o script continua a correr no servidor */
 
if &#40;file_exists&#40;$ficheiro&#41;&#41; /* Verificar se o ficheiro existe */
   
&#123; 
     
$contagem file_get_contents&#40;rtrim&#40;$ficheiro&#41;&#41;; /* Obtemos o conteúdo do ficheiro utilizando file_get_contents e tambem a função rtrim para remover qualquer espaço existente á direita do número de visitas */
    
if &#40;!isset&#40;$_SESSION["listado"&#93;&#41;&#41; /* Se a sessão não estiver definida... */
   &#123; 
         
$contagem++; /* ...acrescentamos um valor no contador.*/
       
&#125; 
 
   
&#125; else &#123; /* No caso do ficheiro de texto não existir vamos tentar cria-lo. Isto será apenas nessessário em sistemas Unix, pois noutros casos não seria nessesário utilizar as funções touch&#40;&#41; &#40;nem chmod&#40;&#41; para dar as permissões&#41;, a função fwrite &#40;mais em baixo&#41; aliado ao modo em que abrimos o ficheiro &#40;w&#41; encarregar-se-ia disso mesmo.*/  
           
           
touch&#40;$ficheiro&#41;; /* Criamos o ficheiro */
   chmod&#40;$ficheiro, 0777&#41;; /* Damos permissões 777 */
           
$contagem "1"// E definimos a primeira visita 
          
&#125; 
$f = @fopen &#40;$ficheiro,"w"&#41;; /* Abrimos o ficheiro em modo de escrita */
     
@flock &#40;$f, LOCK_EX&#41;; /* flock para evitar que o ficheiro fique corrompido &#40;imaginem se duas pessoas entrarem no site ao mesmo tempo...&#41;*/
     
@fwrite&#40;$f,$contagem&#41;; /* Aqui gravamos a contagem no ficheiro */
     
@flock &#40;$f, LOCK_UN&#41;; /* Soltamos o ficheiro... */
     
@fclose&#40;$f&#41;; /* e fechamos logo de seguida. */
$_SESSION["listado"&#93; = true; /* Aqui definimos então a sessão */

ignore_user_abort&#40;true&#41;; /* &#40;Opcional&#41; */

echo "Esta página foi visitada ".$contagem." vezes."/* Mostramos o resultado na página */

?>


A utilização disto é básica, podem guardar o ficheiro como contador.php (por exemplo) e depois onde quiserem mostrar os resultados basta por um include:
Citar
<?php include("contador.php"); ?>

Para evitar que o ficheiro possa ser acedido directamente, podem guarda-lo na root, como sugeri para o ficheiro de texto, o importante é sempre indicar o caminho (path) correctamente.

Mais simples e eficaz que isto, não deve ser fácil encontrar...
Espero que seja útil a alguem :)
Offline

kingless 
Membro
Mensagens 857 Gostos 0
Troféus totais: 27
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Poll Starter Level 5 Level 4 Level 3 Level 2 Level 1

Tem mais comentarios que código nem consigo ver o código...  :? mas parece que esta porreiro o script.  :wink:
Offline

=IceBurn= 
Membro
Mensagens 897 Gostos 3
Feedback +3

Troféus totais: 32
Trófeus: (Ver todos)
Windows User Level 6 Linux User Mobile User Super Combination Combination Topic Starter Poll Voter Poll Starter Level 5

Pois, isso tambem é verdade LoL.... Mas foi por querer explicar todos os promenores....
Offline

-RJ- 
Membro
Mensagens 1188 Gostos 0
Troféus totais: 30
Trófeus: (Ver todos)
Apple User Super Combination Combination Topic Starter 50 Poll Votes 10 Poll Votes Poll Voter Level 5 Level 4 Level 3

Ya, é util sim. :)
Bom trabalho. ;)
Offline

XRS 
Membro
Mensagens 76 Gostos 1
Troféus totais: 21
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Level 4 Level 3 Level 2 Level 1 50 Posts 10 Posts First Post

Mas é assim que se comenta algo.
Gostei muito da forma como comentaste o código.
Já agora é bem útil...
Offline

asturmas 
Administrador
Mensagens 19734 Gostos 49
Feedback +2

Troféus totais: 39
Trófeus: (Ver todos)
Mobile User Windows User Super Combination Combination Topic Starter 100 Poll Votes 50 Poll Votes 10 Poll Votes Poll Voter Poll Starter

Gostei!
Vou experimentar daqui a pouco
Offline

bfms 
Equipa
Mensagens 1769 Gostos 40
Feedback +1

Troféus totais: 35
Trófeus: (Ver todos)
Search Level 6 Apple User Super Combination Combination Topic Starter 50 Poll Votes 10 Poll Votes Poll Voter Poll Starter

Sei que já lá vai algum tempo... mas o código está com alguns caracteres errados.
Ia testar aqui numa página mas o código está como podem ver acima. Também já é tarde amanhã tento corrigir os erros...ou se o IceBurn fizer o favor de postar de novo o código, agradecia.

Até amanhã (logo) eheh
Offline

=IceBurn= 
Membro
Mensagens 897 Gostos 3
Feedback +3

Troféus totais: 32
Trófeus: (Ver todos)
Windows User Level 6 Linux User Mobile User Super Combination Combination Topic Starter Poll Voter Poll Starter Level 5

Já passaram uns anitos, mas deparei-me agora com este tópico e rabisquei aqui uma coisa mais actualizada  :grin:  :grin:

Código: (php) [Seleccione]
<?php

/**
 * @author =IceBurn=
 * @copyleft 2009
 * @site www.tenhamedo.net
 */

session_start();

$ficheiro 'contador.txt';
 
$contagem is_file$ficheiro ) ? file_get_contents$ficheiro ) : '0';

if( !isset( 
$_SESSION['listado'] ) ) {
    
    
//    Descomentar caso surjam problemas de permissoes de ficheiros
    //      
    //    if( $contagem < 1 ) {
    //              
    //        touch( $ficheiro );   
    //        chmod( $ficheiro, 0777 );
    //          
    //    }
    
    
++$contagem;
    
    
ignore_user_aborttrue );
    
    
file_put_contents$ficheiro$contagemLOCK_EX ) or die( 'Erro ao escrever no ficheiro '.$ficheiro.'!' );
    
    
$_SESSION['listado'] = 1;
    
    
ignore_user_abortfalse );

}

echo 
'Esta pagina foi visitada ' $contagem ' vezes.';
?>

Offline

anjo2 
Membro
Mensagens 3020 Gostos 0
Troféus totais: 31
Trófeus: (Ver todos)
Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Poll Starter Level 5 Level 4 Level 3 Level 2

Tira-me o "or die", não vais mandar a página abaixo só por não ter conseguido gravar as estatísticas  :superlol: só mesmo para efeitos de debug. E isso funciona muito mal...
Offline

=IceBurn= 
Membro
Mensagens 897 Gostos 3
Feedback +3

Troféus totais: 32
Trófeus: (Ver todos)
Windows User Level 6 Linux User Mobile User Super Combination Combination Topic Starter Poll Voter Poll Starter Level 5

O funcionamento correcto do código é para gravar os dados, se não gravar, então algo está mal.

Mas claro, quem quiser sempre pode substituir:
   
Código: (php) [Seleccione]
file_put_contents( $ficheiro, $contagem, LOCK_EX ) or die( 'Erro ao escrever no ficheiro '.$ficheiro.'!' );por:
   
Código: (php) [Seleccione]
file_put_contents( $ficheiro, $contagem, LOCK_EX );
Se não for possível escrever no ficheiro vai retornar um E_WARNING.

É bem.