Come dotare un sito dotato ospitato
su server che supporta php e mySQL di un contatore di accessi per ciascun
singolo documento
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.