Come creare un contatore di visite in Php
Tenere traccia del numero di utenti che visualizzano il nostro sito giornalmente è essenziale per capire quali pagine attraggono di più i visitatori. Il report sulle visite può darci un feedback importante per migliorare il sito laddove è possibile.
Il nostro scopo sarà quello di incrementare il contatore non a ogni caricamento di pagina ma solo a ogni nuova visita da parte dell’utente. Se il nostro utente non carica una nuova pagina per molto tempo e poi lo fa di nuovo, possiamo ipotizzare che sia andato a fare altro e poi sia tornato sul sito, quindi ha un senso conteggiare una nuova visita. Possiamo comunque stabilire arbitrariamente un tempo ragionevole oltre il quale si conteggia una nuova visita, ad esempio un’ora. Ma potremmo anche fissarlo in un giorno, tutto dipende dalle nostre esigenze.
Come costruire la nostra piccola applicazione? Innanzitutto gli strumenti di cui abbiamo bisogno sono un piccolo database per conservare i valori dei contatori e i cookie per riconoscere i visitatori ed evitare di conteggiarli più volte.
Contatore visite PHP
Creiamo il database MySql (la copia gratuita è disponibile al sito www.mysql.com con relativa documentazione) collegandoci al server con il client testuale a riga di comando interno a MySql, con MySql Workbench o un gestore via Web come PhpMyAdmin.
Se usiamo il client testuale a riga di comando, il codice Sql per creare un database “contatore” è il seguente:
create database contatore; use contatore;
Creiamo un utente che possa accedere in sicurezza con user e password, a questo database, ma soltanto dalla macchina stessa su cui è installato il database server:
Grant all on contatore.*to cont@'localhost' identified by 'passcontatore';
L’utente si chiamo cont, con password passcontatore. Se il server MySql risiede su una macchina diversa dal webserver del sito sostituiamo localhost in cont@’localhost’ con l’indirizzo giusto del server e assicuriamoci che MySql accetti connessioni dall’esterno.
Fatto ciò possiamo occuparci della connessione al db creando il file Php. Il nome che daremo è connect.php e avrà il seguent codice:
<?php define('MYSQL_HOST','localhost'); define('MYSQL_USER','cont'); define('MYSQL_PASS','passcontatore'); define('MYSQL_DB','contatore'); if(!@mysql_connect(MYSQL_HOST,MYSQL_USER,MYSQL_PASS)){ //Errore di connessione die("Errore di connessione al DB"); }elseif(!@mysql_select_db(MYSQL_DB)){ //Errore DB die("Errore di selezione DB");} ?>
Il comando define definisce una costante, ovvero assegna un valore non modificabile a una stringa. Una costante occupa meno memoria e risorse rispetto a una variabile.
Se eseguendo questo script non si riceve nessun errore significa che la connessione ha funzionato e possiamo procedere con la creazione delle tabelle per i dati. La struttura da creare è semplice, abbiamo bisogno di un identificativo di pagina e un campo contatore. La tabella, quindi, sarà creata con un codice Sql nel seguente modo:
create table conteggi (id_pagina INT NOT NULL PRIMARY KEY, visite INT NOT NULL); insert into conteggi values(0,0),(1,0),(2,0);(3,0);
Per verificare i dati inseriti basta fare:
select * from conteggi;
Nella tabella abbiamo inserito quattro dati, uno con id_pagina=0 che ci serve per conteggiare le visite al sito e tre pagine di cui conteremo i caricamenti. In questo modo, tracciamo sia le visite al sito che quante volte vengono viste le singole pagine. Abbiamo creato solo tre pagine, ma possiamo crearne quante vogliamo.
Passiamo, quindi, all’applicazione vera e propria del contatore: il codice PHP che incrementa i conteggi e ce li mostra in una pagina di test. Creiamo tre file chiamati Pagina1.php, Pagina2.php, Pagina3.php con il codice riportato di seguito per Pagina1.php:
<?php //includiamo il file di connessione al DB include connect.php; //Settiamo l'identificativo di pagina $id_pagina=1;//modificare il valore in 2 o 3 negli altri files //Aggiorniamo sempre il numero di visite a questa pagina mysql_query("UPDATE conteggi SET visite=visite+1 WHERE id_pagina=$id_pagina"); //Aggiorniamo le visite solo se il cookie è scaduto if(!isset($_COOKIE['visitemiosito'])){ mysql_query("UPDATE conteggi SET visite=visite+1 WHERE id_pagina=0");} //Aggiorniamo il cookie della durata di un'ora setcookie('visitemiosito',1,time()+3600); //Carichiamo e visualizziamo le visite al sito $res=mysql_query("select visite from conteggi where id_pagina=0"); $cont=mysql_fetch_array($res); echo "Visite al sito:".$cont['visite']; //Carichiamo e visualizziamo le visite alla pagina $res=mysql_query("select visite from conteggi where id_pagina=$id_pagina"); $cont=mysql_fetch_array($res); echo "- Visite alla pagina $id_pagina: ".$cont['visite']; ?>
Carichiamo i file sul Web server e testiamoli. Accedendo alle tre pagine vedremo come si aggiornano i contatori di pagina, mentre quello del sito si aggiorna solo alla prima pagina caricata. Per vederlo incrementare è possibile fare una prova abbassando il numero di secondi in setcookie() da 3600 a 10, così dopo soli 10 secondi di inattività vedrete il contatore del sito aggiornarsi.
Naturalmente esistono molti tool gratuiti per l’analisi degli accessi ma costruire un counter personalizzato potrebbe rilevarsi utile per le nostre esigenze. I tool che possiamo integrare nel nostro sito sono disponibili online e sono:
Se non disponiamo di un database MySql è possibile comunque creare un semplice counter, utilizzando un file di testo. Creiamo sul nostro sito il file vuoto contatore.txt con permessi di scrittura a chiunque e, nella stessa directory, creiamo il seguente file php:
<?php $filename="contatore.txt"; //Legge il numero di visite $fd=fopen($filename,"r") or die ("Impossibile aprire $filename); $fstring=fread($fd,filesize($filename)); echo "Visite al sito: "."$fstring"; fclose($fd); //Verifica nuova visita ed eventualmente aggiorna il contatore if(!isset($_COOKIE['visitemiosito'])){ $fd=fopen($filename,"w") or die ("Impossibile aprire $filename"); $fcounted=$fstring +1; $fout=fwrite($fd,$fcounted); fclose($fd);} //Imposta il cookie di un'ora setcookie('visitemiosito',1,time()+3600); ?>
Carichiamolo nel browser e vedremo il counter partire da uno per poi aggiornarsi dopo un’ora di inattività.