Homepage -> Guida PHP



REALIZZARE UN COUNTER IN PHP



Vediamo come creare un counter di pagina avanzato con il supporto di un database (), chiamato appunto "andrea_db" (qui trovate il dump e quindi la struttura del database). Questo sarà costituito da 7 tabelle: todooconnectes, todoocount, todoocount_ip, annuale, uniche, totali, url. Le prime tre servono per gestire gli ip delle persone connesse al sito, ed il conteggio delle pagine viste al giorno e totali; mentre le altre servono per gestire i conteggi anno per anno e mese per mese.

Di sotto sono riportate le caratteristiche che vengono mostrate di default nel counter:




Di sotto, invece, sono riportate le caratteristiche che vengono mostrate nella pagina di statistiche del counter:




Un esempio è visibile qui.

Il counter è costituito quindi da un file di configurazione, config.php, dove vengono settati i dati del database, todoocount.php, che printa il counter ed aggiorna i valori, ed il file graf.php, che printa le statistiche.

Il codice php del file todoocount.php è il seguente:


<html>
<head>
<style>
BODY {SCROLLBAR-FACE-COLOR: #dee3e7; SCROLLBAR-HIGHLIGHT-COLOR: #ffffff; SCROLLBAR-SHADOW-COLOR: #dee3e7; SCROLLBAR-3DLIGHT-COLOR: #d1d7dc; SCROLLBAR-ARROW-COLOR: #006699; SCROLLBAR-TRACK-COLOR: #efefef; SCROLLBAR-DARKSHADOW-COLOR: #98aab1; BACKGROUND-COLOR: #e5e5e5; FONT-FAMILY: Verdana, Arial, Helvetica, sans-serif;}
TD {
FONT-FAMILY: Verdana, Arial, Helvetica, sans-serif;font-size:9px;
}
</style>
</head>
<body>

<?
include "config.php";

$db = mysql_connect("$dbserver", "$dbuser", "$dbpass");
mysql_select_db("$dbbase",$db);

$mm = date("m");
switch($mm)
{
     case 01:
     $mese = "gen";
     break;
     case 02:
     $mese = "feb";
     break;
     case 03:
     $mese = "mar";
     break;
     case 04:
     $mese = "apr";
     break;
     case 05:
     $mese = "mag";
     break;
     case 06:
     $mese = "giu";
     break;
     case 07:
     $mese = "lug";
     break;
     case 08:
     $mese = "ago";
     break;
     case 09:
     $mese = "sett";
     break;
     case 10:
     $mese = "ott";
     break;
     case 11:
     $mese = "nov";
     break;
     case 12:
     $mese = "dic";
     break;
}

// DATI TABELLA VISITE UNICHE:

$uni = mysql_query("SELECT * FROM uniche where id=1");

// DATI TABELLA VISITE TOTALI:

$toti = mysql_query("SELECT * FROM totali where id=1");

// DATI TABELLA VISITE ANNUALI:

$annu = mysql_query("SELECT * FROM annuale where id=1");

// DATI TABELLA url: i suoi dati nn vengono cancellati alla fine dell'anno

//echo("ser:".$_SERVER["HTTP_REFERER"]);
if($_SERVER["HTTP_REFERER"]==NULL || $_SERVER["HTTP_REFERER"]=="")
{
     $altro = mysql_query("SELECT * FROM url WHERE id=1");
     while($row=mysql_fetch_array($altro,MYSQL_ASSOC))
     {
          $ret[]=$row;
     }
     $num=$ret[0]["num"]+1;
     $qq=mysql_query("UPDATE url SET num=".$num." WHERE id=1");
}
else
{
     $c = explode("/",$_SERVER["HTTP_REFERER"]);
     //echo $c[2];

     // RICERCO NEL DB L'URL IN QUESTIONE

     $qu="SELECT * FROM url where ref='".$c[2]."'";
     $altro = mysql_query($qu,$db);
     while($row=mysql_fetch_array($altro,MYSQL_ASSOC))
     {
          $ret[]=$row;
     }
     if($ret==null)
     {
          $query="INSERT INTO url (ref,num) VALUES('".$c[2]."',1);";
          $qq=mysql_query($query);
     }
     else
     {
          $num=$ret[0]["num"]+1;
          $qq=mysql_query("UPDATE url SET num=".$num." where id=".$ret[0]["id"]);
     }
}

// DATI TABELLA COUNTER:

$req = mysql_query("SELECT * FROM todoocount where id=0");
$res = mysql_numrows($req);
$totali= mysql_result($req,0,"totali");
$tot_oggi= mysql_result($req,0,"tot_jour");
$uniche = mysql_result($req,0,"uniche");
$jour = mysql_result($req,0,"jour");
$date = mysql_result($req,0,"date");
$date2 = date("Y-m-d");
$ip=$_SERVER['REMOTE_ADDR'];
$anno_corr = date("Y");
$arr_date = explode("-",$date);
$anno_db = $arr_date[0];
if ($anno_corr != $anno_db)
{
// AZZERO TUTTI I VALORI AL CAMBIO DELL'ANNO:

     mysql_query("UPDATE totali SET gen=0, feb=0, mar=0, apr=0, mag=0, giu=0, lug=0, ago=0, sett=0, ott=0, nov=0, dic=0, totali=0 where id=1");
     mysql_query("UPDATE uniche SET gen=0, feb=0, mar=0, apr=0, mag=0, giu=0, lug=0, ago=0, sett=0, ott=0, nov=0, dic=0, totali=0 where id=1");
     mysql_query("UPDATE annuale SET tot_scorso=totali, tot_uniche_scorso=tot_uniche, totali=0, tot_uniche=0 where id=1");
}

if ($date != $date2)
{
// AZZERO IL COUNTER ( solo valori giornalieri ):

     mysql_query("UPDATE todoocount SET date='$date2', jour=0, tot_jour=0 where id=0");
     mysql_query("delete from todoocount_ip");
     mysql_query("DELETE FROM todooconnectes");
     $jour=0;
     $tot_oggi=0;
}

$req2 = mysql_query("SELECT * FROM todoocount_ip where ip like '$ip'");
$res2 = mysql_numrows($req2);
//--------- print_r($res2); $res2 è = 1 quando l'utente è gia entrato nel sito ----------//

echo("<TABLE border=0 cellSpacing=1 cellPadding=3 width='100%'><TR><TD> <A HREF='grafici/graf.php' target=void><IMG SRC='stat.gif' WIDTH=23 HEIGHT=26 BORDER=0 alt='Vedi statistiche' align=top></A> Online dal: <I>30/07/2004</I></TD></TR><TR><TD align=middle><BR><TABLE width='80%' border=0><TR><TD>");

/*     totali : pg viste totali
     uniche : visite uniche totali
     jour : visite uniche giornaliere
     tot_jour : pg viste giornaliere
*/


if($res2 == 1)
{
     $t_g=$tot_oggi+1;
     $tot=$totali+1;
     mysql_query("UPDATE todoocount SET totali=totali+1, tot_jour=tot_jour+1 where id=0");
     mysql_query("UPDATE totali SET totali=totali+1, ".$mese."=".$mese."+1 where id=1");
     mysql_query("UPDATE annuale SET totali=totali+1 where id=1");
     echo "<B>Tot.Pg.Viste :</B> ".$tot."<br><B>Tot.Uniche :</B> ".$uniche."<br><B>Oggi.Uniche :</B> ".$jour."<br><B>Oggi.Totali :</B> ".$t_g."<br>";
}
else
{
     $t_g=$tot_oggi+1;
     $tot=$totali+1;
     $uni=$uniche+1;
     $o=$jour+1;
     mysql_query("INSERT INTO todoocount_ip (ip) VALUES ('$ip')");
     mysql_query("UPDATE todoocount SET totali=totali+1, tot_jour=tot_jour+1, uniche=uniche+1, jour=jour+1 where id=0");
     mysql_query("UPDATE uniche SET totali=totali+1, ".$mese."=".$mese."+1 where id=1");
     mysql_query("UPDATE totali SET totali=totali+1, ".$mese."=".$mese."+1 where id=1");
     mysql_query("UPDATE annuale SET totali=totali+1, tot_uniche=tot_uniche+1 where id=1");
     echo "<B>Tot.Pg.Viste :</B> ".$tot."<br><B>Tot.Uniche : </B>".$uni."<br><B>Oggi.Uniche :</B> ".$o."<br><B>Oggi.Totali :</B> ".$t_g."<br>";
}
$limite = time() + $duree_estimee;
mysql_query("DELETE FROM todooconnectes WHERE ip='$ip' OR date<".time());
mysql_query("INSERT INTO todooconnectes (id,ip,date) VALUES ('0','$ip','$limite')");
$result = mysql_query("SELECT COUNT(id) FROM todooconnectes");
$row = mysql_fetch_row($result);
echo "<B>Online : </B>".$row[0]."";
echo "</TD></TR></TABLE><BR></TD></TR></TABLE><BR>";
mysql_close($db);
?>
</body>
</html>

Da sottolineare è il vettore globale $_SERVER["HTTP_REFERER"], che mi cattura l'url di provenienza (ad es.: http://www.webstyling.it); per poter memorizzare nel db solo il nome del sito (cioè solo www.webstyling.it), è stata usata la funzione di stringhe explode, passandogli come valore del separatore il "/", per cui il terzo valore dell'array $c associato all'explode stesso è proprio il nome del sito da noi voluto. Tale array globale, assume un valore nullo ogni volta che si effettua un refresh di pagina o si scrive il link diretto nella barra degli URL di IE. Queste opzioni vengono tutte catalogate in un'unica voce nel db, chiamata appunto "Altro". $_SERVER['REMOTE_ADDR'], invece, serve per catturare l'ip dell'utente che si collega al sito, in base al quale viene fatto il controllo sugli utenti online e quello delle visite uniche.

Di seguito è invece riportato il codice del file graf.php che printa le statistiche su grafici o tabelle semplici:


<?
include "../config.php";

$db = mysql_connect("$dbserver", "$dbuser", "$dbpass");
mysql_select_db("$dbbase",$db);
$result = mysql_query("SELECT * FROM annuale where id=1");
while($row=mysql_fetch_array($result,MYSQL_ASSOC))
{
     $ret[]=$row;
}
$result2 = mysql_query("SELECT * FROM uniche where id=1");
while($row2=mysql_fetch_array($result2,MYSQL_ASSOC))
{
     $ret2[]=$row2;
}
$result3 = mysql_query("SELECT * FROM totali where id=1");
while($row3=mysql_fetch_array($result3,MYSQL_ASSOC))
{
     $ret3[]=$row3;
}
?>
<HTML>
<HEAD>
<TITLE>Statistiche Annuali sito www.webstyling.it</TITLE>
<style>
BODY {SCROLLBAR-FACE-COLOR: #dee3e7; SCROLLBAR-HIGHLIGHT-COLOR: #ffffff; SCROLLBAR-SHADOW-COLOR: #dee3e7; SCROLLBAR-3DLIGHT-COLOR: #d1d7dc; SCROLLBAR-ARROW-COLOR: #006699; SCROLLBAR-TRACK-COLOR: #efefef; SCROLLBAR-DARKSHADOW-COLOR: #98aab1; BACKGROUND-COLOR: #e5e5e5; FONT-FAMILY: Verdana, Arial, Helvetica, sans-serif;font-size:9px;}
TD {
     FONT-FAMILY: Verdana, Arial, Helvetica, sans-serif;font-size:9px;
}
</style>
<SCRIPT LANGUAGE="JavaScript">
<!-- Hide JavaScript from Java-Impaired Browsers
function getHplot(v1,v2,v3,v4)
{
     n=new initArray(0,0,0,0)
     v=new initArray(0,0,0,0)
     document.write('<TABLE BORDER=0 cellpadding=5 cellspading=15 WIDTH=450><TR><TD ' +'COLSPAN=3 ALIGN=CENTER><B>Riepilogo Annuale ultimi due anni</' +'B><BR><BR></TD></TR>');
     v[0]=v1;
     v[1]=v2;
     v[2]=v3;
     v[3]=v4;
     n[9]=0;
     n[6]=0;
     n[7]=0;
     n[8]=0;
     for (var i=0;i<4;i++){
          if (v[i].length>n[9]){
               n[9]=v[i].length;
          }
/* The next three lines are needed for visitors who
still live on the Win3.x platform. If none of your
visitors use older platforms,
n[i]=eval(v[i]);
may be substituted for these three lines. */

          str=v[i]
          StringToNumber();
          n[i]=num; // eval(v[i]); may be substituted
          if (n[i]<0){
               n[i]=0;
          }
          n[6]+=n[i];
          if (n[i]>n[7]){
               n[7]=n[i];
          }
     }
     n[10]=(n[9]+6)*8
      n[8]=n[7]/(450-n[10]); // my divisor
     document.write('<TR><TD><B>Tot.Scorso' +'</B></TD><TD><IMG SRC="java98a.gif" HEIGHT=10 WIDTH=' +(n[0]/n[8])+' BORDER=1></TD><TD>'+v[0]+'</TD></TR>' +'<TR><TD><B>Tot_Uniche.Scorso' +'</B></TD><TD><IMG SRC="java98b.gif" HEIGHT=10 WIDTH='+(n[1]/n[8]) +' BORDER=1></TD><TD>'+v[1]+'</TD></TR>' +'<TR><TD><B>Totali' +'</B></TD><TD><IMG SRC="java98c.gif" HEIGHT=10 WIDTH='+(n[2]/n[8]) +' BORDER=1></TD><TD>'+v[2]+'</TD></TR>' +'<TR><TD><B>Tot_Uniche' +'</B></TD><TD><IMG SRC="java98d.gif" HEIGHT=10 WIDTH='+(n[3]/n[8]) +' BORDER=1></TD><TD>'+v[3]+'</TD></TR>');
     document.write('<TR><TD COLSPAN=3><HR NOSHADE></TD></TR></TABLE>');
}

function getVplot(title,v1,v2,v3,v4,v5,v6,v7,v8,v9,v10,v11,v12)
{
     n=new initArray(0,0,0,0,0,0,0,0,0,0,0,0)
     v=new initArray(0,0,0,0,0,0,0,0,0,0,0,0)
     v[0]=v1;
     v[1]=v2;
     v[2]=v3;
     v[3]=v4;
     v[4]=v5;
     v[5]=v6;
     v[6]=v7;
     v[7]=v8;
     v[8]=v9;
     v[9]=v10;
     v[10]=v11;
     v[11]=v12;
     n[12]=0;
     n[13]=0;
     n[14]=0;
     n[15]=0;
     for (var i=0;i<12;i++){
          if (v[i].length>n[15]){
               n[15]=v[i].length;
          }
/* The next three lines are needed for visitors who
still live on the Win3.x platform. If none of your
visitors use older platforms,
n[i]=eval(v[i]);
may be substituted for these three lines. */

          str=v[i]
          StringToNumber();
          n[i]=num; // eval(v[i]); may be substituted
          if (n[i]<0){
               n[i]=0;
          }
          n[12]+=n[i];
          if (n[i]>n[13]){
               n[13]=n[i];
          }
     }
     n[14]=n[13]/100; // my divisor
     document.write('<P><TABLE BORDER=0 cellpadding=5 cellspading=15 WIDTH=450><TR><TD' +' COLSPAN=12 ALIGN=CENTER><B>'+title+'</B><BR><BR></TD></TR><TR>' +'<TD VALIGN=BOTTOM ALIGN=CENTER><IMG SRC="java98a.gif" HEIGHT=' +(n[0]/n[14]) +' WIDTH=50 BORDER=1></TD>' +'<TD VALIGN=BOTTOM ALIGN=CENTER><IMG SRC="java98b.gif" HEIGHT=' +(n[1]/n[14])+' WIDTH=50 BORDER=1></TD>' +' <TD VALIGN=BOTTOM ALIGN=CENTER><IMG SRC="java98c.gif" HEIGHT=' +(n[2]/n[14])+' WIDTH=50 BORDER=1></TD>' +' <TD VALIGN=BOTTOM ALIGN=CENTER><IMG SRC="java98d.gif" HEIGHT=' +(n[3]/n[14])+' WIDTH=50 BORDER=1></TD>' +' <TD VALIGN=BOTTOM ALIGN=CENTER><IMG SRC="java98e.gif" HEIGHT=' +(n[4]/n[14])+' WIDTH=50 BORDER=1></TD>' +' <TD VALIGN=BOTTOM ALIGN=CENTER><IMG SRC="java98a.gif" HEIGHT=' +(n[5]/n[14])+' WIDTH=50 BORDER=1></TD>' +' <TD VALIGN=BOTTOM ALIGN=CENTER><IMG SRC="java98b.gif" HEIGHT=' +(n[6]/n[14])+' WIDTH=50 BORDER=1></TD>' +' <TD VALIGN=BOTTOM ALIGN=CENTER><IMG SRC="java98c.gif" HEIGHT=' +(n[7]/n[14])+' WIDTH=50 BORDER=1></TD>' +' <TD VALIGN=BOTTOM ALIGN=CENTER><IMG SRC="java98d.gif" HEIGHT=' +(n[8]/n[14])+' WIDTH=50 BORDER=1></TD>' +' <TD VALIGN=BOTTOM ALIGN=CENTER><IMG SRC="java98e.gif" HEIGHT=' +(n[9]/n[14])+' WIDTH=50 BORDER=1></TD>' +' <TD VALIGN=BOTTOM ALIGN=CENTER><IMG SRC="java98a.gif" HEIGHT=' +(n[10]/n[14])+' WIDTH=50 BORDER=1></TD>' +' <TD VALIGN=BOTTOM ALIGN=CENTER><IMG SRC="java98b.gif" HEIGHT=' +(n[11]/n[14])+' WIDTH=50 BORDER=1></TD></TR><TR>' +' <TD ALIGN=CENTER><B>Gen.</B></TD>' +' <TD ALIGN=CENTER><B>Feb.</B></TD>' +' <TD ALIGN=CENTER><B>Mar.</B></TD>' +' <TD ALIGN=CENTER><B>Apr.</B></TD>' +' <TD ALIGN=CENTER><B>Mag.</B></TD>' +' <TD ALIGN=CENTER><B>Giu.</B></TD>' +' <TD ALIGN=CENTER><B>Lug.</B></TD>' +' <TD ALIGN=CENTER><B>Ago.</B></TD>' +' <TD ALIGN=CENTER><B>Set.</B></TD>' +' <TD ALIGN=CENTER><B>Ott.</B></TD>' +' <TD ALIGN=CENTER><B>Nov.</B></TD>' +' <TD ALIGN=CENTER><B>Dic.</B></TD></TR>' +' <TR><TD ALIGN=CENTER>' +v[0]+' </B></TD>' +' <TD ALIGN=CENTER>' +v[1]+' </TD>' +' <TD ALIGN=CENTER>' +v[2]+' </TD>' +' <TD ALIGN=CENTER>' +v[3]+' </TD>' +' <TD ALIGN=CENTER>' +v[4]+' </TD>' +' <TD ALIGN=CENTER>' +v[5]+' </TD>' +' <TD ALIGN=CENTER>' +v[6]+' </TD>' +' <TD ALIGN=CENTER>' +v[7]+' </TD>' +' <TD ALIGN=CENTER>' +v[8]+' </TD>' +' <TD ALIGN=CENTER>' +v[9]+' </TD>' +' <TD ALIGN=CENTER>' +v[10]+' </TD>' +' <TD ALIGN=CENTER>' +v[11]+' </TD></TR><TR><TD COLSPAN=12' +' ><HR NOSHADE><P></TD></TR></TABLE>' );
}
var pwr=new initArray(1,2,3,4);
pwr[0]=1;
pwr[1]=10;
pwr[2]=100;
pwr[3]=1000;
pwr[4]=10000;
pwr[5]=100000;
pwr[6]=1000000;
pwr[7]=10000000;
pwr[8]=100000000;
pwr[9]=1000000000;
pwr[10]=10000000000;
/* Add more to array - pwr[8]=100000000, etc. -
if strings longer than 8 are to be used. */
var ns="0123456789"
var cr="";
var str="";

/* Pass this function a string (named "str") and it will
return a number (named "num") Useful until all versions
of JavaScript on all platforms support string to numeric
conversions with predictability. */

function StringToNumber(){
     num=0;
     strl=str.length;
     for (var j=strl-1;j>-1;j--){
          cr=str.substring(j,j+1);
          pos=ns.indexOf(cr);
          num+=pos*pwr[strl-j-1];
     }
}

function initArray() {
     this.length=initArray.arguments.length;
     for (var i=0;i<this.length;i++) {
          this[i]=initArray.arguments[i];
     }
} // End Hiding -->
</SCRIPT>

</HEAD>

<BODY>
<BR><BR><BR>
<SCRIPT LANGUAGE="JavaScript">
<!-- Hide from JavaScript-Impaired Browsers
getHplot(' <?echo($ret[0]["tot_scorso"]);?>' ,' <?echo($ret[0]["tot_uniche_scorso"]);?>' ,' <?echo($ret[0]["totali"]);?>' ,' <?echo($ret[0]["tot_uniche"]);?>' );
// End Hiding -->
</SCRIPT>
<BR><BR>
<SCRIPT LANGUAGE="JavaScript">
<!-- Hide from JavaScript-Impaired Browsers
getVplot(' Riepilogo Visite Uniche Corrente
Anno' ,' <?echo($ret2[0]["gen"]);?>' ,' <?echo($ret2[0]["feb"]);?>' ,' <?echo($ret2[0]["mar"]);?>' ,' <?echo($ret2[0]["apr"]);?>' ,' <?echo($ret2[0]["mag"]);?>' ,' <?echo($ret2[0]["giu"]);?>' ,' <?echo($ret2[0]["lug"]);?>' ,' <?echo($ret2[0]["ago"]);?>' ,' <?echo($ret2[0]["sett"]);?>' ,' <?echo($ret2[0]["ott"]);?>' ,' <?echo($ret2[0]["nov"]);?>' ,' <?echo($ret2[0]["dic"]);?>' );
// End Hiding -->
</SCRIPT>
<BR><BR>
<SCRIPT LANGUAGE="JavaScript">
<!-- Hide from JavaScript-Impaired Browsers
getVplot(' Riepilogo Pag. Tot. Viste Corrente
Anno' ,' <?echo($ret3[0]["gen"]);?>' ,' <?echo($ret3[0]["feb"]);?>' ,' <?echo($ret3[0]["mar"]);?>' ,' <?echo($ret3[0]["apr"]);?>' ,' <?echo($ret3[0]["mag"]);?>' ,' <?echo($ret3[0]["giu"]);?>' ,' <?echo($ret3[0]["lug"]);?>' ,' <?echo($ret3[0]["ago"]);?>' ,' <?echo($ret3[0]["sett"]);?>' ,' <?echo($ret3[0]["ott"]);?>' ,' <?echo($ret3[0]["nov"]);?>' ,' <?echo($ret3[0]["dic"]);?>');
// End Hiding -->
</SCRIPT>
<BR><BR>
<TABLE width=450 cellpadding=0 cellspacing=0 border=1 bordercolor=black>
<TR>
     <TD><TABLE width=100% cellpadding=5 cellspacing=5 border=0>
          <TR height=30>
          <TD bgcolor=#CCCCCC>     <B>SITO di provenienza</B></TD>
          <TD bgcolor=#CCCCCC width=25> </TD>
          </TR>
          <?
          $result4 = mysql_query("SELECT * FROM url;");
          while($row4=mysql_fetch_array($result4,MYSQL_ASSOC))
          {
               $ret4[]=$row4;
          }
          foreach($ret4 as $k=>$v)
          {
               echo("<TR height=20><TD>  ".$v["ref"]."</TD><TD><I>".$v["num"]."</I></TD></TR>");
          }
          ?>
          </TABLE>
     </TD>
</TR>
</TABLE><BR><BR>  * <I>Altro</I> : Link diretto o refresh di pagina<BR><BR><BR>
</body>
</html>
<?
mysql_close($db);
?>


che non fa altro che printare le query mysql attraverso grafici, realizzati tramite codice javascript, e tabelle.