http://www.vessella.it KARIBU!
Appunti di programmazione

INDICE

ITALIANO
Copertina
Il topo e il mouse
L'esperanto
Vocabolario esperanto
Vocabolario swahili
Il swahili
Alcuni filmati sulla Tanzania

Scuola
Questionari in inglese

Programmazione
Archivi Access e FrontPage
Gestione Archivi con le funzioni di FrontPage
Proteggere un sito in ASP (I)
Proteggere un sito in ASP (II)
Contatore e Statistiche
Utilizzare CDONTS (provvisorio)
Le date in ASP e SQL
Connessione a un archivio Access
Configurazione di una rete (PDF)
Criteri di protezione (PDF)
Esperanta Klavaro en EeePC kun originala Xandros

ESPERANTO
Koverto
Vortaro itala
Vortaro suahila
La suahila lingvo
Videokasedoj pri Tanzanujo

KISWAHILI
Jalida
Kamusi ya kiesperanto
Lugha ya Kiesperanto
Azimio la Praha
Video juu ya Tanzania

ENGLISH
Home
The Esperanto language
The Swahili language
Some videos on Tanzania

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:  

 


© Nino Vessella , 1996-.
Diritti riservati. Nessuna parte può essere riprodotta, in qualsiasi forma o mezzo, senza citare la fonte.
Ĉiuj rajtoj rezervitaj. Neniu parto povas esti reproduktita, en kiu ajn formo au per kiu ajn metodo, sen mencii ĉi tiun fonton.
Haki zote zimehifadhiwa. Hairuhusiwi kunakili sehemu yoyote bila kuitaja asili yake hii.
All rights reserved. No part may be reproduced, in any form or by any means, without mention of this source.