|
Contatore di accessi e statistiche
La fonte del codice presentato in questi appunti é il seguente articolo:
Counting Page Hits-Views of Your Web-site Using ASP, di
Hassan Sheikh.
Sono funzioni per realizzare un contatore che
permettono anche la compilazione di statistiche di accesso al sito.
Il pacchetto consiste in sei funzioni, incluse in due
file:
Nel file contaasp.asp:
- conta(), ogni volta che viene letta una pagina, apre
un archivio e nella tabella accessi aggiorna il contatore
della pagina, ovviamente se é la prima volta l'aggiunge
- salvavariabili(), salva nella tabella stat le
variabili di sistema utili per la produzione delle statistiche
di accesso.
- sDataStr(), serve per la gestione delle date
trasformandole in stringhe (vedi Date in
ASP e SQL), poichè Access e SQL le utilizzano in modo
diverso e perché alcuni server (Aryba, per esempio) non sono
affidabili.
Nel file elaborastat.asp, che elabora le statistiche:
- Grafico(), mostra graficamente gli accessi di un giorno,
di un mese, di un anno
- Classifica(), compila una graduatoria delle pagine piú
lette.
- strData() e strDataITA(), servono per la gestione delle
date trasformandole in stringhe (vedi Date
in ASP e SQL).
Prima di presentare le funzioni, vediamo come preparare la pagina
(ASP) da controllare.
All'inizio della pagina si deve inserire l'istruzione
<!-- #include file=contaasp.asp -->, quindi richiamare
la funzione conta() nel punto in cui si desidera far apparire
il contatore:
<!-- #include file=contaasp.asp -->
<HTML>
.
.
' Il codice della pagina
.
.
.
<%=Conta()>
</HTML>
|
Vediamo ora cosa serve.
Contatore
contaasp.asp
<SCRIPT LANGUAGE=VBScript RUNAT=SERVER>
Function Conta()
' adovbs.inc:
Const adOpenKeyset = 1
Const adLockPessimistic = 2
Const adCmdText = &H0001
' variabili locali
Dim strFilename
Dim strSQL
Dim rsCounter
Dim iCount,iAmm, lEscludi
' Nome della pagina letta dal visitatore
strFilename = Request.ServerVariables("SCRIPT_NAME")
lEscludi=False
if Request.cookies("Visitatore")="ELABORATOREDAESCLUDERE" then
lEscludi=True
end if
strSQL = "SELECT * FROM accessi WHERE pagina='" & strFilename & "';"
' Apre un insieme di schede
Set rsCounter = Server.CreateObject("ADODB.Recordset")
rsCounter.Open strSQL, "DRIVER={Microsoft Access Driver (*.mdb)};DBQ="& _
Server.MapPath("fpdb/takwimu.mdb") & ";", _
adOpenKeyset, adLockPessimistic, adCmdText
If rsCounter.EOF Then
' Se la pagina non é in archivio, inserirla e attivare i contatori
rsCounter.AddNew
iCount = 0
iAmm = 0
rsCounter.Fields("pagina").Value = strFilename
Else
' Se la pagina giá é in archivio: leggere il numero di accessi
rsCounter.MoveFirst
iCount = rsCounter.Fields("accessi").Value
iAmm = rsCounter.Fields("amm").Value
End If
' Incrementare gli accessi e aggiornare l'archivio
if lEscludi then
rsCounter.Fields("Amm").Value = iAmm + 1
else
rsCounter.Fields("accessi").Value = iCount + 1
end if
rsCounter.Update
rsCounter.Close
Set rsCounter = Nothing
If not lEscludi then
SalvaVariabili()
end if
' Visualizza sulla pagina il numero di accessi.
Conta = "<a href=gestionesito.asp><SPAN style='BACKGROUND-COLOR: springgreen;'> " & CStr(iCount) & " </SPAN></a>"
End Function
Sub SalvaVariabili
URLPagina = Request.ServerVariables("URL")
IPVisitatore = Request.ServerVariables("Remote_Addr")
NomeHostVisitatore=Request.ServerVariables("REMOTE_HOST")
Programma=Request.ServerVariables("HTTP_USER_AGENT")
Referer=Request.ServerVariables("HTTP_REFERER")
StringaRichiedente=Request.ServerVariables("QUERY_STRING")
Sito=Request.ServerVariables("HTTP_HOST")
NomeServer=Request.ServerVariables("SERVER_NAME")
MetodoRichiesta=Request.ServerVariables("REQUEST_METHOD")
strData=sDataStr()
Set oConn = Server.CreateObject ("ADODB.Connection")
strConn="DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & _
server.MapPath("fpdb/takwimu.mdb")
oConn.Open strConn
' Registra le variabili di sistema nel database
' Attenzione: ricordarsi che i campi e i valori da assegnarvi devono essere nello
' stesso ordine.
SQL = "INSERT INTO stat(URLPagina,IPVisitatore,NomeHostVisitatore,Programma," & _
" Sito, Referer, NomeServer, StringaRichiedente, Metodo, strData) " & _
" values('" & URLPagina & "', '" & IPVisitatore & "','" & _
NomeHostVisitatore & "','" & Programma & "','" & _
Sito & "','" & Referer & "','" & NomeServer & "','" & _
StringaRichiedente "','" & MetodoRichiesta & "','" & strData & "')"
oConn.Execute(SQL)
oConn.Close
Set oConn = nothing
end sub
Function sDataStr
sDataStr= right("19" & cStr(Year(Date)),4) & "." & _
right("00" & cStr(Month(Date)),2) & "." & _
right("00" & cStr(Day(Date)),2) & "." & _
right("00" & cStr(Hour(Time)),2) & "." & _
right("00" & cStr(Minute(Time)),2) & "." & _
right("00" & cStr(Second(Time)),2)
end sub
</SCRIPT>
|
Per trattare in modo diverso i nostri accessi al sito si utilizza
il codice evidenziato in rosso: gli
accessi del gestore del sito sono memorizzati in un campo diverso,
'nascosto' e, grazie a un biscottino ('cookie') appositamente
offerto all'elaboratore (vedi nota), non vengono memorizzati nella tabella
utilizzata per le statistiche.
.
.
.
lEscludi=False
if Request.cookies("Visitatore")="ELABORATOREDAESCLUDERE" then
lEscludi=True
end if
.
.
.
If not lEscludi then
SalvaVariabili()
end if
.
.
.
|
Il codice precedente, se si esclude la funzione SalvaVariabili(),
é piú che sufficiente per realizzare un semplice contatore.
Se si desidera, invece, continuare con l'elaborazione delle
statistiche di accesso, serve anche la pagina che segue.
Statistiche
elaborastat.asp
Questa pagina consta di due parti. La prima parte si occupa di
aprire l'archivio .mdb, in cui sono registrati tutti i dati relativi
agli accessi alle pagine sotto controllo e di chiamare la funzione
grafico() per visualizzare un grafico a barre relativo ai
seguenti periodi: oggi, questa settimana, questo mese, quest'anno.
<%
Dim objConn
Dim rsPV
Dim SQL
Dim NumTotaleSchede
Dim LarghezzaBarra
Dim totSchede
Dim DataInizio,FinePeriodo, dInizio, dIS
Dim strPeriodo
Set objConn = Server.CreateObject ("ADODB.Connection")
Set rsPV = Server.CreateObject ("ADODB.Recordset")
strConn="DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & _
server.MapPath("fpdb/takwimu.mdb")
objConn.Open strConn
' del giorno
strPeriodo = "Numero accessi del giorno: "
Grafico rsPV, Date(), Date(), strPeriodo
' Settimana
dIS = DatePart("w", Date, 2)
DataInizio = Date - (dIS-1)
strPeriodo = "Numero accessi della settimana: "
Grafico rsPV, DataInizio, Date(), strPeriodo
' Mese
DataInizio = DateSerial(Year(Date),Month(Date),1)
strPeriodo = "Numero accessi del mese: "
Grafico rsPV, DataInizio, Date(), strPeriodo
' Anno
DataInizio = DateSerial(Year(Date),1,1)
strPeriodo = "Numero accessi dell'anno: "
Grafico rsPV, DataInizio, Date(), strPeriodo
' I 10 piú visitati
Classifica rsPV, 10
' Libera la memoria
objConn.Close
Set rsPV = nothing
Set objConn = nothing
.
.
.
|
Seguono le funzioni per la visualizzazione del grafico a barre.
Notare le conversioni delle date: una volta per poterle utilizzare
nella stringa SQL, un'altra per visualizzarle nel formato italiano.
.
.
.
Sub Grafico(rsPV, DataInizio, DataFine, strPeriodo)
Dim fData,iData
fData=strData(DataFine)
iData=strData(DataInizio)
DataInizio=strDataITA(DataInizio)
DataFine=strDataITA(DataFine)
SQL="SELECT Count(URLPagina) AS TotPagina, URLPagina AS URL " & _
" FROM Stat " & _
" WHERE DataAccesso BETWEEN '" & iData & ".00.00.00' AND '" & fData & ".23.59.59' " & _
" GROUP BY URLPagina ORDER BY Count(URLPagina) DESC"
rsPV.Source = SQL
rsPV.ActiveConnection = objConn
rsPV.CursorType = 3 'adOpenStatic
rsPV.CursorLocation = 3 'adUseClient
rsPV.Open
if rsPV.EOF or rsPV.BOF then
Response.Write "<Center>"
Response.Write "<table>"
Response.Write ("<tr><td colspan=2 bgcolor='#cc3300'>")
Response.Write ("<font size=2 color=white><strong>NESSUN ACCESSO")
Response.Write ("</strong><BR>")
Response.Write ("</font></td></tr>")
else
NumTotaleSchede = rsPV.Fields("TotPagina").Value
' Barra orizzontale
Response.Write "<Center>"
Response.Write "<table>"
Response.Write ("<tr><td colspan=2 bgcolor='#cc3300'>")
Response.Write ("<font size=2 color=white><strong>" & strPeriodo)
if DataInizio<>DataFine then
Response.Write ("dal <font size=2 color=yellow>" & DataInizio & "</font> ")
Response.Write ("al <font size=2 color=yellow>" & DataFine & "</font> ")
else
Response.Write (" <font size=2 color=yellow>" & DataInizio & "</font> ")
end if
Response.Write ("</strong><BR>")
Response.Write ("</font></td></tr>")
Response.Write ("<tr><td bgcolor='#004080'><font size=2 color=white><strong>URL</strong></font></td>")
Response.Write ("<td bgcolor='#004080'><font size=2 color=white><strong>Accessi</strong></font></td>")
Response.Write ("</tr>")
While not rsPV.EOF
Response.Write("<tr>")
Response.Write("<td><font size=1>")
Response.Write rsPV.Fields("URL").Value & " "
Response.Write "</font></td>"
Response.Write "<td>"
Response.Write("<font size=2>")
LarghezzaBarra = (CInt(((rsPV.Fields("TotPagina").Value) / NumTotaleSchede) * 100) * 3) + 5
' 1.gif é un quadratino 1x1 colorato
Response.Write("<img src='images/1.gif' height='12' width='" & LarghezzaBarra &"'></img>")
Response.Write("<font size=1> " & rsPV.Fields("TotPagina").Value & "</font>")
Response.Write("</font>")
Response.Write("</td>")
Response.Write("</tr>")
rsPV.MoveNext
WEnd
end if
rsPV.Close
Response.Write "<tr><td colspan=2>"
Response.Write "<HR>"
Response.Write "</td></tr>"
Response.Write "</table>"
Response.Write "<Center>"
End Sub
Sub Classifica(rsPV, TotPagina)
'Lettura degli accessi
SQL = "Select Count(URLPagina) as TotPagina, URLPagina as URL"
SQL = SQL & " From stat"
SQL = SQL & " Group by URLPagina "
SQL = SQL & " Order by Count(URLPagina) Desc "
rsPV.Source = SQL
rsPV.ActiveConnection = objConn
rsPV.CursorType = 3 'adOpenStatic
rsPV.CursorLocation = 3 'adUseClient
rsPV.Open
if rsPV.EOF or rsPV.BOF then
Response.Write "<Center>"
Response.Write "<table>"
Response.Write ("<tr><td colspan=2 bgcolor='#cc3300'>")
Response.Write ("<font size=2 color=white><strong>NESSUN ACCESSO")
Response.Write ("</strong><BR>")
Response.Write ("</font></td></tr>")
else
NumTotaleSchede = rsPV.Fields("TotPagina").Value
if rsPV.RecordCount < TotPagina Then
TotPagina = rsPV.RecordCount
end if
'Barra orizzontale
Response.Write "<Center>"
Response.Write "<table>"
Response.Write ("<tr><td colspan=2 bgcolor='#cc3300'>")
Response.Write("<font size=2 color=white><strong>In ordine decrescente")
Response.Write(" <font size=2 color=yellow>" & TotPagina & "</font> ")
Response.Write("</strong><BR>")
Response.Write("</font></td></tr>")
Response.Write ("<tr><td bgcolor='#004080'><font size=2 color=white><strong>URL</strong></font></td>")
Response.Write ("<td bgcolor='#004080'><font size=2 color=white><strong>Accessi</strong></font></td>")
Response.Write ("</tr>")
Dim iCounter
iCounter = 1
While iCounter <= TotPagina
Response.Write("<tr>")
Response.Write("<td><font size=1>")
Response.Write rsPV.Fields("URL").Value & " "
Response.Write "</font></td>"
Response.Write "<td>"
Response.Write("<font size=2>")
LarghezzaBarra = (CInt(((rsPV.Fields("TotPagina").Value) / NumTotaleSchede) * 100) * 3) + 5
' 1.gif é un quadratino 1x1 colorato
Response.Write("<img src='images/1.gif' height='12' width='" & LarghezzaBarra &"'></img>")
Response.Write("<font size=1> " & rsPV.Fields("TotPagina").Value & "</font>")
Response.Write("</font>")
Response.Write("</td>")
Response.Write("</tr>")
rsPV.MoveNext
iCounter = iCounter + 1
WEnd
end if
rsPV.Close
Response.Write "<tr><td colspan=2>"
Response.Write "<HR>"
Response.Write "</td></tr>"
Response.Write "</table>"
Response.Write "<Center>"
End Sub
Function strData( dData )
strData = right("19" & cStr(Year(dData)),4) & "." & _
right("00" & cStr(Month(dData)),2) & "." & _
right("00" & cStr(Day(dData)),2)
End Function
Function strDataITA(sData)
asDataITA = Split(sData,".",3)
strData = asDataIta(2) & "-" & asDataIta(1) & "-" & asDataIta(0)
End Function
|
L'archivio
L'archivio mdb che nell'esempio si chiama takwimu ha
due tabelle:
|
Tabella accessi:
|
| Nome campo |
Tipo dati/Dimensione |
| nProg |
Contatore |
| pagina |
Testo/255 |
| accessi |
numerico |
| amm |
numerico |
|
|
|
Tabella stat
|
| Nome campo |
Tipo dati/Dimensione |
| nProg |
Contatore |
| URLPagina |
Testo/255 |
| DataAccesso |
Testo/20 |
| IPVisitatore |
Testo/15 |
| NomeHostVisitatore |
Testo/255 |
| Programma |
Testo/255 |
| Sito |
Testo/255 |
| Referer |
Testo/255 |
| NomeServer |
Testo/255 |
| MetodoRichiesta |
Testo/255 |
| StringaRichiedente |
Testo/255 |
|
Questo archivio contiene dati ridondanti o inutili per il
codice presentato in questa pagina, ma servono per una prossima
versione!
ESEMPIO
Adesso?
Io ho inserito questo codice in una raccolta di funzioni per la
gestione del sito (gestione dell'archivio dei codici di accesso, archivio
delle immagini, delle cartoline, ecc.) che richiamo da una pagina protetta
(almeno spero).
Questa pagina protetta potrebbe essere richiamata anche premendo sul contatore
degli accessi. Per ottenere questo basta modificare l'ultima linea della
funzione Conta() presente in contaasp.asp:
<SCRIPT LANGUAGE=VBScript RUNAT=SERVER>
Function Conta()
.
.
.
' Visualizza sulla pagina il numero di accessi.
Conta = "<a href=gestionesito.asp><SPAN style='BACKGROUND-COLOR: springgreen;'> " & CStr(iCount) & " </SPAN>
</a>"
End Function
|
Ovviamente, al posto della pagina protetta per la gestione del sito
gestionesito.asp si puó richiamare direttamente la pagina
elaborastat.asp.
Nota
Per far accettare il biscottino al nostro elaboratore scrivere una pagina provvisoria con il
seguente codice:
<%
Response.Cookies("visitatore") = "ELABORATOREDAESCLUDERE"
Response.Cookies("visitatore").Expires = "December 30, 2035"
%>
|
poi pubblicarla sul proprio sito, aprirla e cancellarla.
Scarica i file
Ritorna al testo
Ultima modifica: 20011219
Numero di lettori:
|