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.