PDA

View Full Version : Contatore


Kinh
17-08-2003, 20:10
ragazzi un aiuto serio
sto delirando, non riesco a fare un contatore di accessi per un sito in asp e come database un file txt

ne avete di gia pronti?

mello
17-08-2003, 22:43
ti consiglio di guardare su http://freeasp.html.it/

di sicuro trovi qualcosa....


ciao


:sofico: :sofico: :sofico:

Kinh
17-08-2003, 22:46
Originariamente inviato da mello
ti consiglio di guardare su http://freeasp.html.it/

di sicuro trovi qualcosa....


ciao


:sofico: :sofico: :sofico:
lo so gia visto
giuro non riesco a farne andare uno
me ne serve uno testato gia pronto

maxithron
18-08-2003, 00:52
questo funziona:

http://www.aspcode.it/articoli/articoli.asp?act1=show_art&idx=12

Kinh
18-08-2003, 07:16
Originariamente inviato da maxithron
questo funziona:

http://www.aspcode.it/articoli/articoli.asp?act1=show_art&idx=12
allora
lavoro con dreamweaver
ho creato il file visite.txt e l'ho messo nella cartella che ho creato "public" sulla root del sito
sempre sulla root ho messo il contatore copiando esattamente il codice

vado alla pagina e mi dice

Microsoft VBScript runtime error '800a0046'

Permission denied

/contatore.asp, line 25


perchè?

cionci
18-08-2003, 11:29
L'errore te lo da perchè probabilmente non hai la cartella /public sul tuo server web...

Sinceramente un contatore del genere mi lascia un po' perplesso... E' sintatticamente scorretto...può portare sia a pardita di conteggi, sia ad inconsistenza del contenuto del file...

Vi spiego perchè...


<%
Dim nomefile, filestream
nomefile = Server.MapPath("/public/visite.txt")
Set objFile = CreateObject("Scripting.FileSystemObject")

'se il file non esiste, crealo
if not objFile.FileExists(nomefile) then
Set filestream = objFile.OpenTextFile(nomefile, 2, true)
filestream.WriteLine("0")
end if

'legge il numero attuale di visite
Set filestream = objFile.OpenTextFile(nomefile, 1, true)
Dim visite
visite = filestream.ReadLine()
filestream.Close

'punto UNO

'se non è ancora presente la variabile di sessione
if Session("visiting")<>1 then
Session("visiting") = 1 'crea la variabile di sessione
visite = visite + 1 'incrementa di uno gli accessi al sito
end if

'scrive nel file il valore aggiornato di visite
Set filestream = objFile.CreateTextFile(nomefile, true)
'punto DUE
filestream.WriteLine(visite)
filestream.Close

Set filestream = Nothing
Set objFile = Nothing

'visualizza sul browser il numero totale di visite
Response.Write "Numero visite: " &visite
%>

Tenete conto di due esecuzioni parallele del codice: A e B

Nel file c'è il numero 1000...

A arriva al punto UNO e legge 1000...
B arriva al punto DUE e legge 1000...

A arriva al punto DUE e scrive 1001...
B arriva al punto DUE e scrive 1001...

Ecco che si è perso un conteggio... Il file doveva contenere 1002...

Riguardo all'inconsistenza contenuto del file... Non so come e se viene gestita la mutua esclusione sull'accesso al file...
OpenTextFile attende che un file sia stato chiuso ? Spero di sì altrimenti ci sarebbero molti errori...
Ad esempio A è al punto DUE, B arriva al punto UNO...B non ha letto nessun numero del file...

Senza contare le possibilità di scrittura contemporanea con WriteFile...che porterebbero a risultati inconsistenti (a meno che questa possibilità venga gestita da ASP in modo intelligente)...

Quindi secondo me se si vuole fare un buon contatore, senza ricorrere ad un database, bisogna utilizzare le variabili di applicazione e gli eventi nel global.asa !!!

Una cosa semplice (contenuto del file Global.asa):

<SCRIPT LANGUAGE=VBScript RUNAT=Server>
Sub Application_OnStart
Dim nomefile, filestream
nomefile = Server.MapPath("/public/visite.txt")
Application("nomefile") = nomefile
Set objFile = CreateObject("Scripting.FileSystemObject")

'se il file non esiste, crealo
if not objFile.FileExists(nomefile) then
Set filestream = objFile.OpenTextFile(nomefile, 2, true)
filestream.WriteLine("0")
end if

'legge il numero attuale di visite
Set filestream = objFile.OpenTextFile(nomefile, 1, true)
Dim visite
visite = filestream.ReadLine()
filestream.Close

Application("Contatore") = visite
Application("UtentiOnline") = 0

Set filestream = Nothing
Set objFile = Nothing
End Sub

Sub Application_OnEnd
Dim nomefile, filestream
nomefile = Application("nomefile")
Set objFile = CreateObject("Scripting.FileSystemObject")

'scrive nel file il valore aggiornato di visite
Set filestream = objFile.CreateTextFile(nomefile, true)
filestream.WriteLine(Application("Contatore"))
filestream.Close

Set filestream = Nothing
Set objFile = Nothing
End Sub

Sub Session_OnStart
Application("Contatore") = Application("Contatore") + 1
Application("UtentiOnline") = Application("UtentiOnline") + 1
End Sub

Sub Session_OnEnd
Application("UtentiOnline") = Application("UtentiOnline") - 1
End Sub
</SCRIPT>

In questo modo hai sia un contatore di visite che di utenti online...

Kinh
18-08-2003, 11:32
grazie dell'aiuto ma se non ci spieghiamo bene non potrò mai capire
dove lo metto il codice?
in una pagina asp o php?
la pagina dove la metto?

maxithron
18-08-2003, 11:35
quoto dal link:

"Una caratteristica importante di questo contatore, è che esso evita di conteggiare i reload al sito (per intenderci, quegli accessi che vengono conteggiati quando si clicca sul pulsante aggiorna del browser), o gli eventuali ritorni alla home page dopo aver visitato pagine interne al sito: per implementare questa "feature" utilizziamo una variabile di sessione che creiamo nel momento in cui un utente entra nel nostro sito a cui diamo il valore 1; prima di incrementare il contatore verrà verificato che questa variabile abbia un valore diverso da 1 (se non è così significa che l'utente è già passato dalla home page del nostro sito durante quella sessione e che quindi il suo accesso è già stato conteggiato)."

ma è chiaro che è solo un riferimento per chi ha una certa fretta.


cmq..al solito, hai fatto un'ottima analisi!

:p :p :p

Kinh
18-08-2003, 11:38
lo dico almeno faccio chiarezza
non ho MAI usato asp o php quindi parto proprio da 0

VICIUS
18-08-2003, 13:32
Originariamente inviato da Kinh
lo dico almeno faccio chiarezza
non ho MAI usato asp o php quindi parto proprio da 0

OT: vedo che sei il webmaster del sito dei Lacuna Coil. grandissimo gruppo. :cool:

ciao ;)

Kinh
18-08-2003, 13:33
Originariamente inviato da VICIUS
OT: vedo che sei il webmaster del sito dei Lacuna Coil. grandissimo gruppo. :cool:

ciao ;)
si che se quando tornano non imparo un po di asp mi sotterrano :D

cionci
18-08-2003, 16:34
Quello che ho scritto lo devi mettere in un file chiamato global.asa che va messo all'interno della root del server web...

Per visualizzare il valore del contatore:

<%= Application("Contatore") %>

Per visualizzare il numero di utenti online:

<%= Application("UtentiOnline") %>

Kinh
18-08-2003, 16:36
Originariamente inviato da cionci
Quello che ho scritto lo devi mettere in un file chiamato global.asa che va messo all'interno della root del server web...

Per visualizzare il valore del contatore:

<%= Application("Contatore") %>

Per visualizzare il numero di utenti online:

<%= Application("UtentiOnline") %>

mmm ok
praticamente faccio un file global.asa e scrivo dentro tutta la pappardella
ma poi?

cionci
18-08-2003, 16:44
Poi per visualizzare il contatore scrivi quello che ti ho scritto sopra all'interno del codice HTML di una pagina con estensione .asp...

Ad esempio:

<html>
<head>
<title></title>
</head>
<body>
Contatore: <%= Application("Contatore") %>
Utenti online: <%= Application("UtentiOnline") %>
</body>
</html>

Ricopia il codice da mettere in global.asa...c'era un errorino...
Comunque funziona egregiamente...ho provato...

Kinh
18-08-2003, 16:47
Originariamente inviato da cionci
Poi per visualizzare il contatore scrivi quello che ti ho scritto sopra all'interno del codice HTML di una pagina con estensione .asp...

Ad esempio:

<html>
<head>
<title></title>
</head>
<body>
Contatore: <%= Application("Contatore") %>
Utenti online: <%= Application("UtentiOnline") %>
</body>
</html>

ok dimmi se ho capito bene passo passo
faccio un file ASP con dentro questo codice


<%
Dim nomefile, filestream
nomefile = Server.MapPath("/public/visite.txt")
Set objFile = CreateObject("Scripting.FileSystemObject")

'se il file non esiste, crealo
if not objFile.FileExists(nomefile) then
Set filestream = objFile.OpenTextFile(nomefile, 2, true)
filestream.WriteLine("0")
end if

'legge il numero attuale di visite
Set filestream = objFile.OpenTextFile(nomefile, 1, true)
Dim visite
visite = filestream.ReadLine()
filestream.Close

'punto UNO

'se non è ancora presente la variabile di sessione
if Session("visiting")<>1 then
Session("visiting") = 1 'crea la variabile di sessione
visite = visite + 1 'incrementa di uno gli accessi al sito
end if

'scrive nel file il valore aggiornato di visite
Set filestream = objFile.CreateTextFile(nomefile, true)
'punto DUE
filestream.WriteLine(visite)
filestream.Close

Set filestream = Nothing
Set objFile = Nothing

'visualizza sul browser il numero totale di visite
Response.Write "Numero visite: " &visite
%>


lo metto sulla root

poi chessò nella mia index metto

Contatore: <%= Application("Contatore") %>
Utenti online: <%= Application("UtentiOnline") %>

e tutto funziona?

cionci
18-08-2003, 17:06
Il codice da mettere in global.asa non è quello, ma quello che avevo postato dopo, sempre nello stesso post...

Comunque usa questo che è modificato e previene il fatto che se si pianta il server web si perdano tutti i conteggi...

<SCRIPT LANGUAGE=VBScript RUNAT=Server>
Sub Application_OnStart
Dim nomefile, filestream
nomefile = Server.MapPath("/visite.txt")
Application("nomefile") = nomefile
Set objFile = CreateObject("Scripting.FileSystemObject")

'se il file non esiste, crealo
if not objFile.FileExists(nomefile) then
Set filestream = objFile.OpenTextFile(nomefile, 2, true)
filestream.WriteLine("0")
end if

'legge il numero attuale di visite
Set filestream = objFile.OpenTextFile(nomefile, 1, true)
Dim visite
visite = filestream.ReadLine()
filestream.Close

Application("Contatore") = visite
Application("UtentiOnline") = 0

Set filestream = Nothing
Set objFile = Nothing
End Sub

Sub Application_OnEnd
Dim nomefile, filestream
nomefile = Application("nomefile")
Set objFile = CreateObject("Scripting.FileSystemObject")

'scrive nel file il valore aggiornato di visite
Set filestream = objFile.CreateTextFile(nomefile, true)
filestream.WriteLine(Application("Contatore"))
filestream.Close

Set filestream = Nothing
Set objFile = Nothing
End Sub

Sub Session_OnStart
Application("Contatore") = Application("Contatore") + 1
Application("UtentiOnline") = Application("UtentiOnline") + 1
End Sub

Sub Session_OnEnd
Application("UtentiOnline") = Application("UtentiOnline") - 1

Dim numeroVisite
numeroVisite = Application("Contatore")
If (numeroVisite Mod 100 = 0) Then
Dim nomefile, filestream
nomefile = Application("nomefile")
Set objFile = CreateObject("Scripting.FileSystemObject")

'scrive nel file il valore aggiornato di visite
Set filestream = objFile.CreateTextFile(nomefile, true)
filestream.WriteLine(Application("Contatore"))
filestream.Close

Set filestream = Nothing
Set objFile = Nothing
End If
End Sub
</SCRIPT>

cionci
18-08-2003, 17:08
Originariamente inviato da Kinh
poi chessò nella mia index metto
index.asp mi raccomando... E' sempre codice ASP e va utilizzati in file con estensione .asp !!! ;)

Kinh
18-08-2003, 17:08
non cè che mi ricapitoli che mi sa che mi sto confondendo?
mi dici cosa fare e dove passo passo

:rolleyes: grassie

cionci
18-08-2003, 17:13
Avevi detto tutto bene... L'unica cosa è che avevi sbagliato a copiare il codice da mettere in global.asa...

Metti il codice sopra in global.asa...copi il file nella root...nei tuoi file .asp puoi richiamare i contatori con il emtodo scritto sopra...

Kinh
18-08-2003, 17:20
ma non capisco
il codice global.asa che hai detto tu è quello che ho scritto

<SCRIPT LANGUAGE=VBScript RUNAT=Server>
Sub Application_OnStart
Dim nomefile, filestream
nomefile = Server.MapPath("/public/visite.txt")
Application("nomefile") = nomefile
Set objFile = CreateObject("Scripting.FileSystemObject")

'se il file non esiste, crealo
if not objFile.FileExists(nomefile) then
Set filestream = objFile.OpenTextFile(nomefile, 2, true)
filestream.WriteLine("0")
end if

'legge il numero attuale di visite
Set filestream = objFile.OpenTextFile(nomefile, 1, true)
Dim visite
visite = filestream.ReadLine()
filestream.Close

Application("Contatore") = visite
Application("UtentiOnline") = 0

Set filestream = Nothing
Set objFile = Nothing
End Sub

Sub Application_OnEnd
Dim nomefile, filestream
nomefile = Application("nomefile")
Set objFile = CreateObject("Scripting.FileSystemObject")

'scrive nel file il valore aggiornato di visite
Set filestream = objFile.CreateTextFile(nomefile, true)
filestream.WriteLine(Application("Contatore"))
filestream.Close

Set filestream = Nothing
Set objFile = Nothing
End Sub

Sub Session_OnStart
Application("Contatore") = Application("Contatore") + 1
Application("UtentiOnline") = Application("UtentiOnline") + 1
End Sub

Sub Session_OnEnd
Application("UtentiOnline") = Application("UtentiOnline") - 1
End Sub
</SCRIPT>

non è che mi mandi un esempio?rischiamo solo di nn capirci cosi :mc:

cionci
19-08-2003, 10:43
Ecco il global.asa...

cionci
19-08-2003, 10:48
E questo è il file di prova...

Kinh
19-08-2003, 18:19
ma questi 2 file dove vanno messi?

cionci
21-08-2003, 08:42
global.asa nella / del sito web... Il file di prova dove ti pare, basta che sia in directory visibile dal sito web...

Kinh
21-08-2003, 10:25
Originariamente inviato da cionci
global.asa nella / del sito web... Il file di prova dove ti pare, basta che sia in directory visibile dal sito web...
il file di prova deve stare in una cartella con permessi di lettura/scrittura o in una qualsiasi?

cionci
21-08-2003, 12:07
In una qualsiasi...

Kinh
21-08-2003, 12:36
Originariamente inviato da cionci
In una qualsiasi...
non funziona
quando apro il file di prova mi viene fuori

Microsoft VBScript runtime error '800a000d'

Type mismatch: '[string: ""]'

//global.asa, line 42

cionci
21-08-2003, 16:44
Quale server web usi ? Con quale sistema operativo ?

cionci
21-08-2003, 16:56
Cerca queste righe in global.asa:

Sub Session_OnStart
Application("Contatore") = Application("Contatore") + 1
Application("UtentiOnline") = Application("UtentiOnline") + 1
End Sub

Sub Session_OnEnd
Application("UtentiOnline") = Application("UtentiOnline") - 1

...e cambiale con queste:

Sub Session_OnStart
Dim temp
temp = Application("Contatore")
temp = temp + 1
Application("Contatore") = temp
temp = Application("UtentiOnline")
temp = temp + 1
Application("UtentiOnline") = temp
End Sub

Sub Session_OnEnd
Dim temp
temp = Application("UtentiOnline")
temp = temp - 1
Application("UtentiOnline") = temp

Anche se mi sembra strano che debba essere fatta una sostituzione del genere...ma su versioni vecchie di IIS avevo avuto anche di questi problemi...

Kinh
21-08-2003, 18:49
cambiato ora viene questa cosa

Microsoft VBScript runtime error '800a000d'

Type mismatch: 'temp'

//global.asa, line 44



uso win xp ma le prove non le faccio in locale ma direttamente su aruba

cionci
22-08-2003, 08:52
Ah...ok...allora forse siamo ad una soluzione...
Cambia le stesse righe con queste:

Sub Session_OnStart
Dim temp
temp = CInt(Application("Contatore"))
temp = temp + 1
Application("Contatore") = temp
temp = CInt(Application("UtentiOnline"))
temp = temp + 1
Application("UtentiOnline") = temp
End Sub

Sub Session_OnEnd
Dim temp
temp = CInt(Application("UtentiOnline"))
temp = temp - 1
Application("UtentiOnline") = temp

Anche questo mi era già successo in passato...

Kinh
22-08-2003, 11:48
niente da fate

Microsoft VBScript runtime error '800a000d'

Type mismatch: 'CInt'

//global.asa, line 43



ti riporto anche tutto il codice del global.asa aggiornato ad ora prima che sto sbagliando io




<SCRIPT LANGUAGE=VBScript RUNAT=Server>
Sub Application_OnStart
Dim nomefile, filestream
nomefile = Server.MapPath("/visite.txt")
Application("nomefile") = nomefile
Set objFile = CreateObject("Scripting.FileSystemObject")

'se il file non esiste, crealo
if not objFile.FileExists(nomefile) then
Set filestream = objFile.OpenTextFile(nomefile, 2, true)
filestream.WriteLine("0")
end if

'legge il numero attuale di visite
Set filestream = objFile.OpenTextFile(nomefile, 1, true)
Dim visite
visite = filestream.ReadLine()
filestream.Close

Application("Contatore") = visite
Application("UtentiOnline") = 0

Set filestream = Nothing
Set objFile = Nothing
End Sub

Sub Application_OnEnd
Dim nomefile, filestream
nomefile = Application("nomefile")
Set objFile = CreateObject("Scripting.FileSystemObject")

'scrive nel file il valore aggiornato di visite
Set filestream = objFile.CreateTextFile(nomefile, true)
filestream.WriteLine(Application("Contatore"))
filestream.Close

Set filestream = Nothing
Set objFile = Nothing
End Sub

Sub Session_OnStart
Dim temp
temp = CInt(Application("Contatore"))
temp = temp + 1
Application("Contatore") = temp
temp = CInt(Application("UtentiOnline"))
temp = temp + 1
Application("UtentiOnline") = temp
End Sub

Sub Session_OnEnd
Dim temp
temp = CInt(Application("UtentiOnline"))
temp = temp - 1
Application("UtentiOnline") = temp

Dim numeroVisite
numeroVisite = Application("Contatore")
If (numeroVisite Mod 100 = 0) Then
Dim nomefile, filestream
nomefile = Application("nomefile")
Set objFile = CreateObject("Scripting.FileSystemObject")

'scrive nel file il valore aggiornato di visite
Set filestream = objFile.CreateTextFile(nomefile, true)
filestream.WriteLine(Application("Contatore"))
filestream.Close

Set filestream = Nothing
Set objFile = Nothing
End If
End Sub
</SCRIPT>

cionci
22-08-2003, 12:34
Mi dispiace, ma non riesco a capire quale sia il problema a me funziona benissimo...

Kinh
22-08-2003, 12:37
te la spero che non me ne intendo
può essere che non ci siano i permessi di lettura scrittura nel sito?

cionci
22-08-2003, 12:39
Non credo visto che da un errore di interpretazione (come se il codice scritto sia errato), non di esecuzione...

Kinh
22-08-2003, 13:00
boh mi pare di avere fatto tutto giusto non so che fare :(