Contare gli utenti connessi e monitorare le pagine visitate.

Le sezioni di un sito web sono organizzate in cartelle, in ognuna delle quali vengono raccolte le pagine, le immagini e tutti gli elementi che, nel loro insieme, descrivono un aspetto dei documenti disponibili. Una sezione, prevede la presenza di una pagina iniziale (home page) che, tra le varie informazioni, contiene i link per navigare all'interno della sezione, o per spostarsi in un'altra sezione. La home page ha il nome convenzionale index.php.

Nella cartella principale del sito creare la sottocartella Monitor, all'interno di questa si creerà il file index.php. Creare due sottocartelle: Sezione1 e Sezione2, in ciascuna delle quali si creerà il file index.php.


Preparare un database contenente una tabella per memorizzare le informazioni relative agli utenti connessi e alla cronologia delle pagine visitate.

CreaDB.php

<html>

<head>

<title></title>

</head>

<body>

<?php

$host = "localhost";

$utente = "root";

$pw = "";

$con = mysql_connect($host, $utente, $pw)
or
die("impossibile connettersi a mysql");


$nomeDB = "UtentiConnessi";
$query ="create database ".$nomeDB;

if (mysql_query($query, $con)) echo "Creato il database ".$nomeDB;

else {

  echo "il data base ".$nomeDB." esiste";

  mysql_close($con);

  exit();

}


mysql_select_db($nomeDB, $con);


$query = "CREATE TABLE UtentiOnLine (

    tempo int(15) NOT NULL PRIMARY KEY,

    ip varchar(15) NOT NULL,

    file varchar(50) NOT NULL

    )";

$esito = mysql_query($query,$con);

if ($esito) echo "<br />creata la tabella UtentiOnLine";

else echo "<br>non sono riuscito a creare la tabella UtentiOnLine";

mysql_close($con);

?>

</body>

</html>


Impostazioni di stile

Lo script seguente contiene solo la dichiarazione delle variabili riferite dai programmi che visualizzeranno il conteggio degli utenti connessi.

"dbconf.php"

<?php

$host = "localhost";

$utente = "root";

$pw = "";

$nomeDB = "UtentiConnessi";

$tabella = "UtentiOnLine";

$timeout = "5"; // minuti oltre il quale un visitatore è; cancellato dal db

$bghl = "#FFFFFF"; // Colore sfondo cella superiore

$bgfl = "#FFFFFF"; // Colore sfondo celle sottostanti

$frase = "Utenti connessi:"; // Testo che precede il valore 'utenti online'

$singolare = "utente è in "; // Testo utente e pagina visitata

$plurale = "utenti sono in "; // Testo per più utenti in una pagina

?>


Registrazione della cronologia

Lo script seguente deve essere inserito in ciascuna pagina che si vuole monitorare. Esso ha lo scopo di acquisire il titolo della pagina, l'indirizzo IP dell'utente e registrarli nel data base.

riepilogo.php

<?php

include ("dbconf.php");

$pagineaperte = Array();

$tarrivo = time();

$trascorso = $tarrivo-($timeout*60);

$ip = $_SERVER['REMOTE_ADDR'];

$file = $_SERVER['PHP_SELF'];

$_SERVER['PHP_SELF'] restituisce il percorso, rispetto alla radice, del file contenente lo script attualmente in esecuzione. Ad esempio se lo script è all'indirizzo: http://esempio.com/directory/index.php, restituisce /directory/index.php e, in questo caso, lo memorizza nella variabile $file

$con = mysql_connect($host, $utente, $pw);

if (!$con) {

  echo "impossibile connettersi";

  exit();

}

mysql_select_db($nomeDB, $con);

$esito = mysql_query("INSERT INTO $tabella VALUES('$tarrivo', '$ip', '$file')", $con);

$esito = mysql_query("DELETE FROM $tabella WHERE tempo<'$trascorso'", $con);

$esito = mysql_query("SELECT DISTINCT ip FROM $tabella", $con);

La query di selezione estrae dai record della tabella gli indirizzi IP degli utenti connessi e li inserisce nella tabella temporanea $esito.

La funzione num_rows conta il numero di righe che formano la tabella temporanea $esito ed assegna il valore alla variabile $nrUtenti, cioè il numero di utenti connessi.

$nrUtenti = mysql_numrows($esito);

echo "<table border='0' align='center' bgcolor='#A3D6FF'><tr><td bgcolor='$bghl' align='center'>";

echo "<font size='1'>$frase: $nrUtenti</font></td></tr>";

unset($file);

unset elimina la variabile $file perchè verrà usata per contenere i nomi dei file degli altri utenti

Nella variabile $row inserisce un record prelevato dalla tabella ottenuta dalla query e ne legge l'indirizzo

for ($i = 0; $i < $nrUtenti; $i++) {

  $row = mysql_fetch_array($esito);

  $ip = $row['ip'];

  $esito2 = mysql_query("SELECT file FROM $tabella WHERE ip='$ip' ORDER BY tempo DESC", $con);

interroga la tabella per ottenere tutte le pagine aperte dall'utente

  $row2 = mysql_fetch_array($esito2);

  $datei = $row2['file'];

  $datei = explode("/", $datei);

Nella variabile $datei c'è il percorso del file aperto dall'utente

La funzione explode() ottiene un array di tanti elementi quanti ne trova separati dal carattere / se il file aperto è /index.php, in $datei, che diventa un array associativo, c'è una stringa vuota in posizione 0 e "index.php" nella posizone 1.

  $file="";

  for ($xy=0; $xy<count($datei)-1; $xy++) {

    $file .= $datei[$xy];

    if ($xy<(count($datei)-2)) $file .= "/";

  }

  if (count($datei)==2) $file .= $datei[$xy];

  if (!array_key_exists($file, $pagineaperte)) {

    $pagineaperte[$file]=0;

  }

  $pagineaperte[$file]++;

  if (count($datei)==2) $linkVisitati[$file] = "/".$file;

  else $linkVisitati[$file] = $file;

  unset ($file);

}

Il ciclo for compone, nella variabile $file, il percorso separato da "/"

Se il file si trova nella directory radice, si preleva solo il nome, senza "/"

Se il nome del file non è ancora una chiave dell'array associativo $pagineaperte viene creata la chiave: basta usarla come indice dell'array in un'assegnazione

si conta un altro accesso

si crea un altro array associativo, $linkVisitati,

arsort($pagineaperte);

while (list($key, $val) = each($pagineaperte)) {

  echo "<tr><td bgcolor=\"$bgfl\" align=\"center\">";

  if($val>1) echo "<font size=\"1\">$val $plurale</font> ";

  else echo "<font size=\"1\">$val $singolare</font> ";

  $pagename = $linkVisitati[$key];

echo "<br />".$pagename."<br />";

switch($pagename) {

    case "/Monitor" :

      $titoloPagina = "home page";

      break;

    case "/Monitor/Sezione1" :

      $titoloPagina = "Sezione 1";

      break;

    case "/Monitor/Sezione2" :

      $titoloPagina = "Sezione 2";

      break;

    // qui aggiungere altre sezioni "case … break" per ulteriori pagine

    default:

      $titoloPagina = "altre pagine";

  }

echo "<a href='$linkVisitati[$key]'>$titoloPagina</a>";

}

mysql_close($con);

echo "</td></tr></table>";

?>

La funzione arsort ordina un array associativo, senza perdere l'associazione tra la chiave e il valore.

La funzione list compie un'assegnazione, nell'ordine, di un elenco di valori specificati a secondo membro alle variabili specificate tra le parentesi.
each - Restituisce la corrente coppia chiave/valore di un array e incrementa il puntatore dell'array

A seconda del numero di utenti connessi sceglie se usare il singolare o il plurale nella frase che verrà stampata.

Con il switch si associa la pagina ad un nome o a un titolo. I titoli usati sono solo di esempio, vanno adattati ai nomi di pagine realmente presenti nel sito.

N.B. lo script riconosce gli utenti solo se hanno IP diverso


Negli script seguenti si usano due istruzioni equivalenti include e require. Hanno lo scopo di inserire uno script php all'interno di un altro SCRIPT, prima che il server lo esegua. La sola differenza tra le due istruzioni è che in caso di errore, require ferma l'esecuzione dello script, mentre include segnala un warning continua l'esecuzione dello script.

Monitor/index.php

La home page del sito.

<html>

<head>

<title></title>

</head>

<body>

<ul>

<li>Visita la <a href="Sezione1/index.php">Sezione 1</a></li>

<li>Visita la <a href="Sezione2/index.php">Sezione 2</a></li>

<li>Sei in Home</li>

</ol>

<hr />

<?php

include("dbconf.php");

require("riepilogo.php");

?>

<hr />

Lo script che segue, inserito nella pagina iniziale del sito, riepiloga le pagine visitate dall'utente. Potrebbe essere inserito in tutte le pagine da monitorare.

<p>Pagine Visitate:</p>

<?php

include ("dbconf.php");

$con = mysql_connect($host, $utente, $pw);

mysql_select_db($nomeDB, $con);

$tempo = time();

$ip = $_SERVER["REMOTE_ADDR"];

$file = $_SERVER["PHP_SELF"];

$esito = mysql_query("INSERT INTO $tabella VALUES ('$tempo','$ip','$file')",$con);

$esito = mysql_query("SELECT file FROM $tabella WHERE ip='$ip' ORDER BY tempo DESC", $con);

while ($row2 = mysql_fetch_array($esito)) echo $row2['file'] ."<br />";

mysql_close($con);

?>

</body>

</html>


Monitor/Sezione1/index.php

La pagina iniziale della sezione 1:

<html>

<head>

<title></title>

</head>

<body>

<ul>

<li>Sei nella Sezione 1</li>

<li>Visita la <a href="../Sezione2/index.php">Sezione 2</a></li>

<li><a href="../index.php">Home</a></li>

</ol>

<hr />

<?php

include ("../dbconf.php");

require("../riepilogo.php");

?>

</body>

</html>


Monitor/Sezione2/index.php

La pagina iniziale della sezione 2:

<html>

<head>

<title></title>

</head>

<body>

<ol>

<li>Visita la <a href="../Sezione1/index.php">Sezione 1</a></li>

<li>Sei nella sezione 2</li>

<li><a href="../index.php">Home</a></li>

</ol>

<?php

include ("../dbconf.php");

require("../riepilogo.php");

?>

</body>

</html>

Problemi

Modificare le proprietà di stile per mostrare la tabella con le informazioni da monitorare in un'area laterale della pagina

Inserire altre sezioni