Come dotare un sito dotato ospitato su server che supporta php e mySQL di un contatore di accessi per ciascun singolo documento

back to HomePage

 

 

 

La soluzione che esporremo è stata implementata per il nostro sito learningsources, ospitato sul server di altervista.org, che mette a disposizione php5 e mySQL5.

Salteremo i passaggi necessari per attivare il database. Esso ha in altervista il nome del vostro sito preceduto da "my". Il database mySQL che è stato utilizzato per questo sito è quindi "my_learningsources".

Mediante l'applicativo phpMyAdmin, messo a disposizione per gestire il database, creiamo una tabella, che denomineremo ContatoreAccessi, con la seguente struttura:

 

CAMPO

TIPO

FUNZIONE

Indice

bigint(20)

chiave primaria

Documento

text

(65335 caratteri max)

E' il nome del documento visitato

Accessi

int(11)

E' il contatore degli accessi

 

All'interno di ogni singolo documento, inseriamo un codice javascript destinato ad attivarsi al momento del suo caricamento:

 

<script language="JavaScript" src="AggiornaDatabase.js"></script>

<body onload="getData('MyScript.php?NomeDocumentoChiamante='+getFileName());">

 

Ecco il codice dello script AggiornaDatabase.js di cui abbiamo inserito il riferimento nella prima delle due righe di codice

 

  var XMLHttpRequestObject = false;

 

  if (window.XMLHttpRequest)

   {

   XMLHttpRequestObject = new XMLHttpRequest();

   }

  else if (window.ActiveXObject)

   {

   XMLHttpRequestObject = new ActiveXObject("Microsoft.XMLHTTP");

   }

 

  function getData(dataSource)

  {

   if(XMLHttpRequestObject)

    {

    XMLHttpRequestObject.open("GET",dataSource);

    XMLHttpRequestObject.onreadystatechange = function()

     {

     if (XMLHttpRequestObject.readyState == 4 &&

         XMLHttpRequestObject.status == 200)

      {

      var stringa = XMLHttpRequestObject.responseText;

      }

     }

    XMLHttpRequestObject.send(null);

    var stringa = XMLHttpRequestObject.responseText;

    }

  }

 

function getFileName(){

 if(document.URL.indexOf("altervista.org/") == -1){stringa="";}

 else {stringa = document.URL.substring(document.URL.indexOf("altervista.org/")+15,document.URL.indexOf(".",document.URL.indexOf(".org/")+1));}

 return stringa;}

 

La funzione getData riceve come parametro la stringa:

"MyScript.php?NomeDocumentoChiamante=…"

dove i puntini, cioè il nome del documento che chiama la routine è ricavato dalla URL mediante la funzione di parsing getFileName(), pure contenuta in AggiornaDatabase.js.

La funzione getData è basata su codice ajax: essa si connetterà in modo asincrono al file MyScript.php sul database, passandogli come parametro il nome del documento. Il codice di MyScript.php non fornisce a getData() alcun dato di ritorno: le sue istruzioni faranno sì che, operando dal lato server, MyScript.php si colleghi al database my_learningsources e aggiorni la tabella ContatoreAccessi. Il collegamento asincrono serve ad evitare che dopo l'esecuzione il browser carichi MyScript.php, ciò che porterebbe alla visualizzazione di una pagina bianca.

Ecco il codice di MyScript.php:

 

<?php

//ACQUISISCE IL NOME DEL DOCUMENTO APERTO

$NomeFile=$_GET['NomeDocumentoChiamante'];

$CampoIndice='Indice';

$CampoDocumento='Documento';

$CampoAccessi='Accessi';

 

//CONNESSIONE AL DATABASE

$host = 'localhost';

$user = 'learningsources';

$password = '';

$database = 'my_learningsources';

$tabella = 'ContatoreAccessi';

$db=mysql_connect($host,$user,$password)

or die("Impossibile connettersi al server $host");

mysql_select_db($database,$db)

or die("Impossibile connettersi al database $database");

 

//SELEZIONA I RECORD CON IL NOME DEL DOCUMENTO

$query="select * FROM $tabella WHERE $CampoDocumento LIKE '$NomeFile'";

$dbResult=mysql_query($query,$db);

$AffectedRows=mysql_affected_rows($db);

 

//SE NON ESISTE UN RECORD INTESTATO AL DOCUMENTO, NE INSERISCE UNO E INIZIALIZZA IL VALORE ACCESSI AD UNO

//SE ESISTE UN RECORD INTESTATO AL DOCUMENTO AUMENTA DI UNO IL VALORE DEGLI ACCESSI

if ($AffectedRows<=0)

{//INSERISCE UN NUOVO RECORD, CORRISPONDENTE AL NOME DEL FILE ED INIZIALIZZA IL VALORE ACCESSI AD UNO

 $ValoreAccessi=1;

 $sql = "INSERT INTO $tabella($CampoDocumento,$CampoAccessi) VALUES('$NomeFile',1)";

 $dbResult=mysql_query($sql,$db);

}

else

{//LEGGE IL VALORE DEGLI ACCESSI

 $RecordSet=mysql_fetch_array($dbResult,MYSQL_NUM);

 mysql_data_seek($Recordset,0);

 $ValoreAccessi=$RecordSet[2];

//AUMENTA IL VALORE DEGLI ACCESSI DI UNA UNITA'

 $ValoreAccessi=$ValoreAccessi+1;

 //AGGIORNA IL VALORE DEL CAMPO ACCESSI

 $sql="UPDATE $tabella SET $CampoAccessi = '$ValoreAccessi' WHERE $CampoDocumento LIKE '$NomeFile'";

 $dbResult=mysql_query($sql,$db);

}

 

//CHIUDE IL DATABASE

mysql_close($db);

?>

 

In questo modo il database si genera praticamente da sé: se il nome del documento visitato ancora non esiste nel database, sarà MyScript.php ad inserire un nuovo record e a procedere al suo aggiornamento.