Contatore di visite in PHP e MySQL

In questo articolo vediamo come tener traccia delle visite alle nostre pagine web, tramite PHP e MySQL.

Siamo nella seguente situazione:
abbiamo la nostra classica tabella dove vengono salvati i nostri posts o articoli, di base così composta:

CREATE TABLE IF NOT EXISTS articoli (
  id INT( 6 ) NOT NULL AUTO_INCREMENT PRIMARY KEY,
  titolo VARCHAR( 150 ) NOT NULL,
  contenuto TEXT NOT NULL,
) ENGINE = MYISAM DEFAULT CHARSET = utf8;

e decidiamo di creare un sistema per la registrazione delle visite dei nostri articoli.
Per fare ciò ci avvarremo di una tabella così composta:

CREATE TABLE IF NOT EXISTS visite (
  ip VARCHAR( 15 ) NOT NULL, 
  id_articolo INT( 6) NOT NULL, 
  data_visita DATETIME NOT NULL
) ENGINE = MYISAM DEFAULT CHARSET = utf8;

adesso dobbiamo creare un funzione, che ogni qualvolta sarà visitato un articolo, si occuperà di registrare le visite.
Ma prima abbiamo alcuni punti da prendere in considerazione:

Per ottenere una statistica un minimo veritiera dobbiamo far in modo che uno stesso visitatore non venga registrato nel nostro database due volte in un tempo inferiore ai 30 minuti dalla visita precedente (nel caso esista).
Ovviamente per fare questo abbiamo bisogno dell’IP del nostro visitatore, che come è ben noto ogni nodo e cioè ogni singolo utente sulla rete Internet è identificato univocamente da un indirizzo IP.
Ed è buona norma prima di effettuare un salvataggio della visita all’articolo, controllare se quest’ultimo esiste o meno.

Dopo aver considerato i nostri punti passiamo al codice della funzione:

function aggiungiVisita ($id_articolo) 
{
  $ip_visitatore = mysql_real_escape_string( $_SERVER['REMOTE_ADDR'] );
  $link = mysql_connect('localhost', 'mysql_user', 'mysql_password');
 
if(!$link) {
  die('Connessione non effettuata: ' . mysql_error());
}
 
$db_selected = mysql_select_db('mysql_db', $link);
 
if(!$db_selected) {
  die ('Impossibile selezionare il database: ' . mysql_error());
}
 
$result = mysql_query("
  INSERT INTO visite ( id_articolo, ip, data_visita ) 
  SELECT " . $id_articolo . " ,  '" . $ip_visitatore . "', NOW()
  FROM articoli
  WHERE articoli.id = " . $id_articolo . "
  AND
  articoli.id NOT IN (
    SELECT id_articolo
    FROM visite_articoli
    WHERE ip =  '" . $ip_visitatore . "'
    AND data_visita > SUBDATE( NOW() , INTERVAL 30 MINUTE )
)");
 
 
 
 
 
if (!$result) {
  die('Query fallita: ' . mysql_error());
}

mysql_free_result($result);
mysql_close($link);
}

si può notare che i controlli per tutti i punti discussi in precedenza, avvengono all’interno della query che esegue il salvataggio, ciò rende il codice molto più performante, in quanto viene tutto eseguito dal motore MySQL.

adesso per salvare le nostre visite basta richiamare la funzione aggiungiVisita() all’interno delle pagine che intendiamo contare le visite, passando come parametro l’id dell’articolo:

aggiungiVisista($id_articolo);

Ciao e alla prossima..