/ Forside / Teknologi / Udvikling / ASP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
ASP
#NavnPoint
smorch 9259
Harlekin 1866
molokyle 1040
Steffanst.. 758
gandalf 657
smilly 564
gibson 560
cumano 530
MouseKeep.. 480
10  Random 410
Tælle unikke besøg
Fra : Erik Ginnerskov


Dato : 09-02-05 13:08

Hej NG

Jeg er kommet over dette script:

<%
Set fs = CreateObject("Scripting.FileSystemObject")
Wfile=server.mappath("counter.txt")
on error resume next
Set count = fs.OpenTextFile(Wfile)
hits = Clng(count.ReadLine)
hits = hits + 1
count.close
if error then
hits = 1
end if
Set count = fs.CreateTextFile(Wfile,True)
count.WriteLine(hits)
count.Close
%>
<%=hits%>

.... som for så vidt da fungerer. Der er bare det problem, at hvis brugeren
laver en genindlæsning af den side, tælleren er installeret på, tælles der
en gang til. Deraf må også formodes (er ikke blevet testet), at hvis
tælleren installeres på flere sider på et site, vil hvert sideskift give en
ny tælling.

Derfor mit spørgsmål: Hvordan kan det modificeres, så der kun tælles unikke
besøg:

ingen optælling ved genindlæsning af side
ingen optælling ved sideskift på sitet
ingen optælling ved genbesøg inden for eks. 20 minutter?

--
Med venlig hilsen
Erik Ginnerskov
http://hjemmesideskolen.dk - http://html-faq.dk
http://ginnerskov.frac.dk



 
 
Jens Gyldenkærne Cla~ (09-02-2005)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 09-02-05 13:42

Erik Ginnerskov skrev:

> ingen optælling ved genindlæsning af side
> ingen optælling ved sideskift på sitet
> ingen optælling ved genbesøg inden for eks. 20 minutter?

Alle de nævnte ting kan klares ved hjælp af session.

Du kan ændre scriptet ved at tilføje et tjek før tællerkoden køres:

If Not session("isCounted") Then
   ' Kør tællerkode
   
   ' Sæt session-variabel
   session("isCounted") = True
End If

En anden og måske smartere mulighed er at lægge tællerkoden i global.asa
under Session_OnStart. Den kode køres netop når en session starter
(altså når en bruger første gang kalder en asp-side).

Man kan evt. overveje at gemme antallet i en applicationvariabel i
stedet for i en fil - det er hurtigere at tilgå og dermed er der mindre
chance for evt. flaskehalsproblemer. Men så kommer problemet med at man
skal have skrevet tallet fra Application-variablen ned i filen hvis
applikationen genstarter. Man kan muligvis placere den kode i
Application_OnEnd, men jeg er ikke sikker på at det vil virke til enhver
tid.

Hvis tællerkoden giver problemer ved samtidige brugere, kan du prøve at
sætte Application.Lock ... Application.Unlock uden om filoperationen.
Det skulle sikre at kun én bruger får adgang til at åbne/læse/skrive
filen ad gangen - men kan så til gengæld betyde at andre brugere kommer
til at vente på at få vist en side.   

--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

Erik Ginnerskov (09-02-2005)
Kommentar
Fra : Erik Ginnerskov


Dato : 09-02-05 13:59

Jens Gyldenkærne Clausen wrote:

>> ingen optælling ved genindlæsning af side
>> ingen optælling ved sideskift på sitet
>> ingen optælling ved genbesøg inden for eks. 20 minutter?
>
> Alle de nævnte ting kan klares ved hjælp af session.

Netop min tanke, men jeg kunne ikke få det formuleret i scriptet, så det
fungerer.
>
> Du kan ændre scriptet ved at tilføje et tjek før tællerkoden køres:
>
> If Not session("isCounted") Then
> ' Kør tællerkode
>
> ' Sæt session-variabel
> session("isCounted") = True
> End If

Det vil jeg forsøge at få lagt ind.

> Hvis tællerkoden giver problemer ved samtidige brugere, kan du prøve
> at sætte Application.Lock ... Application.Unlock uden om
> filoperationen. Det skulle sikre at kun én bruger får adgang til at
> åbne/læse/skrive filen ad gangen - men kan så til gengæld betyde at
> andre brugere kommer til at vente på at få vist en side.

Jeg tror ikke, det tager mange splitsekunder at opdatere et tal i en
tekstfil, der kun indeholder dette tal og intet andet.

> En anden og måske smartere mulighed er at lægge tællerkoden i
> global.asa under Session_OnStart. Den kode køres netop når en session
> starter (altså når en bruger første gang kalder en asp-side).

Du kan se min global.asa i øverste kodeboks på

http://hjemmesideskolen.dk/scripts/brugere.asp

Hvordan ville du putte det ind der, så det ikke forstyrrer den anden
funktion i den fil? Og hvordan skal aflæsningen af data skrives på siderne?

> Man kan evt. overveje at gemme antallet i en applicationvariabel i
> stedet for i en fil - det er hurtigere at tilgå og dermed er der
> mindre chance for evt. flaskehalsproblemer.

Så render vi igen ind i det kedelige, at jeg er total novice i asp.

--
Med venlig hilsen
Erik Ginnerskov
http://hjemmesideskolen.dk - http://html-faq.dk
http://ginnerskov.frac.dk



Erik Ginnerskov (09-02-2005)
Kommentar
Fra : Erik Ginnerskov


Dato : 09-02-05 14:14

Jens Gyldenkærne Clausen wrote:
>
> If Not session("isCounted") Then
> ' Kør tællerkode
>
> ' Sæt session-variabel
> session("isCounted") = True
> End If

Jeg prøvede dette:

<%
If Not session("isCounted") Then
Set fs = CreateObject("Scripting.FileSystemObject")
Wfile=server.mappath("counter.txt")
on error resume next
Set count = fs.OpenTextFile(Wfile)
hits = Clng(count.ReadLine)
hits = hits + 1
count.close
session("isCounted") = True
End If
if error then
hits = 1
end if
Set count = fs.CreateTextFile(Wfile,True)
count.WriteLine(hits)
count.Close
%>

.... og får denne fejlmelding:

HTTP 500,100 - Intern fejl på serveren - ASP-fejl -
Fejltype:
Der opstod en Microsoft VBScript-kørselsfejl (0x800A01A8)
Et objekt er obligatorisk: 'fs'

--
Med venlig hilsen
Erik Ginnerskov
http://hjemmesideskolen.dk - http://html-faq.dk
http://ginnerskov.frac.dk



Jens Gyldenkærne Cla~ (09-02-2005)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 09-02-05 14:51

Erik Ginnerskov skrev:

> If Not session("isCounted") Then
> Set fs = CreateObject("Scripting.FileSystemObject")
> Wfile=server.mappath("counter.txt")
> on error resume next

Jeg vil foreslå dig at udkommentere linjen herover (on error...) mens du
tester - det gør det noget lettere at finde fejl.

> Set count = fs.OpenTextFile(Wfile)
> hits = Clng(count.ReadLine)
> hits = hits + 1
> count.close
> session("isCounted") = True
> End If

Hov - du skal ikke stoppe din if-sætning her. Hvis if-sætningen er falsk
vil koden fortsætte herefter - det giver ikke det ønskede resultat.

> if error then

Det er vist en hjemmegjort måde at lave fejlhåndtering på (jeg har
googlet efter den og et af de få steder jeg har set den brugt er i det
script du har kopieret).

Normalt bruger man

If err.Number > 0
' der er opstået en fejl
End If


> Set count = fs.CreateTextFile(Wfile,True)

Her er dit aktuelle problem. Du opretter fs-objektet inde i en
if-sætning, men bruger det uden for if-sætningen. Derfor vil det gå galt
når betingelsen i if-sætningen ikke er opfyldt.

Du skal pakke hele tællerhåndteringen ind i den første if.

--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

Jens Gyldenkærne Cla~ (09-02-2005)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 09-02-05 14:57

Jens Gyldenkærne Clausen skrev en noget klodset formulering:

> Hov - du skal ikke stoppe din if-sætning her. Hvis if-sætningen er falsk
> vil koden fortsætte herefter

Sikke noget vrøvl - koden fortsætter selvfølgelig efter if-sætningen
uanset om den er sand eller falsk. Pointen var at asp-parseren vil
begynde midt i en kodestump hvis if-sætningen er falsk - og det er det
der giver problemer.

Med din if-sætning har du delt noget kode der hører sammen.

--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

Erik Ginnerskov (09-02-2005)
Kommentar
Fra : Erik Ginnerskov


Dato : 09-02-05 16:28

Jens Gyldenkærne Clausen wrote:
>> Set count = fs.CreateTextFile(Wfile,True)
>
> Her er dit aktuelle problem. Du opretter fs-objektet inde i en
> if-sætning, men bruger det uden for if-sætningen. Derfor vil det gå
> galt når betingelsen i if-sætningen ikke er opfyldt.
>
> Du skal pakke hele tællerhåndteringen ind i den første if.

Nu har jeg møbleret lidt om:

<%
If Not session("isCounted") Then
Set fs = CreateObject("Scripting.FileSystemObject")
Wfile=server.mappath("counter.txt")
on error resume next
Set count = fs.OpenTextFile(Wfile)
hits = Clng(count.ReadLine)
hits = hits + 1
count.close
if error then
hits = 1
end if
Set count = fs.CreateTextFile(Wfile,True)
count.WriteLine(hits)
count.Close
session("isCounted") = True
End If
%>
<p>Antal besøg: <%=hits%></p>

Så får jeg ikke fejlmelding. Men jeg får kun udskrift af tælleren ved første
indlæsning af siden. Ved genindlæsning af siden inden et endnu ikke kendt
minimum tidsrum returneres ikke noget tal.

Jeg har prøvet at vente 20 minutter, så kan den igen læse fra tekstfilen.

--
Med venlig hilsen
Erik Ginnerskov
http://hjemmesideskolen.dk - http://html-faq.dk
http://ginnerskov.frac.dk



Jens Gyldenkærne Cla~ (09-02-2005)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 09-02-05 16:43

Erik Ginnerskov skrev:

> Så får jeg ikke fejlmelding. Men jeg får kun udskrift af tælleren ved første
> indlæsning af siden. Ved genindlæsning af siden inden et endnu ikke kendt
> minimum tidsrum returneres ikke noget tal.

Det er logisk nok (jeg overså det bare før) - hits læses fra filen som
kun hentes ved sessionstart.

En simpel ændring der skulle klare det er følgende:

Set fs = CreateObject("Scripting.FileSystemObject")
Wfile=server.mappath("counter.txt")
on error resume next
Set count = fs.OpenTextFile(Wfile)
hits = Clng(count.ReadLine)
count.close
If Not session("isCounted") Then
   hits = hits + 1
   count.close
   if error then
   hits = 1
   end if
   Set count = fs.CreateTextFile(Wfile,True)
   count.WriteLine(hits)
   count.Close
   session("isCounted") = True
End If
%>
<p>Antal besøg: <%=hits%></p>

Nu er det kun selve skrivehandlingen der ikke udføres ved gentagne
requests.

--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

Erik Ginnerskov (09-02-2005)
Kommentar
Fra : Erik Ginnerskov


Dato : 09-02-05 18:08

Jens Gyldenkærne Clausen wrote:

> Det er logisk nok (jeg overså det bare før) - hits læses fra filen som
> kun hentes ved sessionstart.
>
> En simpel ændring der skulle klare det er følgende:
[klip kode]
> Nu er det kun selve skrivehandlingen der ikke udføres ved gentagne
> requests.

Det ser ud til at virke - er foreløbig kun testet på en enkelt side men med
tre browsere på samme maskine.

Ved genindlæsning kort efter første indlæsning af siden opdateres tælleren
ikke.
Ved genindlæsning af siden efter en rum tid opdateres tælleren.
Hvis sitet forlades og derefter igen besøges, opdateres tælleren.
Hvis siden indlæses i en anden browser, opdateres tælleren.

Uanset vilkår aflæses og udskrives tæller på siden.

En nærlæsning af den kode, du kreerede viser, at det er den logiske
opbygning:

1. Aflæs tællefilen, hvis den eksisterer
2. Tjekke session
2a. eventuelt opdatere
3. Lave tællefil, hvis ikke eksisterer
4. Lukke filen

Jeg bukker og takker.

--
Med venlig hilsen
Erik Ginnerskov
http://hjemmesideskolen.dk - http://html-faq.dk
http://ginnerskov.frac.dk



Johnny Winther Ronne~ (09-02-2005)
Kommentar
Fra : Johnny Winther Ronne~


Dato : 09-02-05 16:49


"Erik Ginnerskov" <erik@donotspammmeplease.invalid> skrev i en meddelelse
news:420a2c18$0$29280$14726298@news.sunsite.dk...
> Jens Gyldenkærne Clausen wrote:
> >> Set count = fs.CreateTextFile(Wfile,True)
> >
> > Her er dit aktuelle problem. Du opretter fs-objektet inde i en
> > if-sætning, men bruger det uden for if-sætningen. Derfor vil det gå
> > galt når betingelsen i if-sætningen ikke er opfyldt.
> >
> > Du skal pakke hele tællerhåndteringen ind i den første if.
>
> Nu har jeg møbleret lidt om:
>
> <%
> If Not session("isCounted") Then
> Set fs = CreateObject("Scripting.FileSystemObject")
> Wfile=server.mappath("counter.txt")
> on error resume next
> Set count = fs.OpenTextFile(Wfile)
> hits = Clng(count.ReadLine)
> hits = hits + 1
> count.close
> if error then
> hits = 1
> end if
> Set count = fs.CreateTextFile(Wfile,True)
> count.WriteLine(hits)
> count.Close
> session("isCounted") = True
> End If
> %>
> <p>Antal besøg: <%=hits%></p>
>
> Så får jeg ikke fejlmelding. Men jeg får kun udskrift af tælleren ved
første
> indlæsning af siden. Ved genindlæsning af siden inden et endnu ikke kendt
> minimum tidsrum returneres ikke noget tal.
>
> Jeg har prøvet at vente 20 minutter, så kan den igen læse fra tekstfilen.
>

Det er fordi din indgangsværdi er sat i session, først når sessionen udløber
bliver filen indlæst.
Sæt en else del på if sætningern der kun indlæser værdien når siden
genindlæses også.

Med venlig hilsen
Johnny Winther Ronnenberg




Lars Hoffmann (09-02-2005)
Kommentar
Fra : Lars Hoffmann


Dato : 09-02-05 15:56

"Erik Ginnerskov" <erik@donotspammmeplease.invalid> wrote

> ... og får denne fejlmelding:
>
> HTTP 500,100 - Intern fejl på serveren - ASP-fejl -
> Fejltype:
> Der opstod en Microsoft VBScript-kørselsfejl (0x800A01A8)
> Et objekt er obligatorisk: 'fs'

Du skal have det hele inde i din i sætning:

If Not session("isCounted") Then
Set fs = CreateObject("Scripting.FileSystemObject")
Wfile = server.mappath("counter.txt")
Set count = fs.OpenTextFile(Wfile)
hits = Clng(count.ReadLine)
hits = hits + 1
session("isCounted") = True
count.Close
end if

Med venlig hilsen
Larss Hoffmann


--
Posted via Mailgate.ORG Server - http://www.Mailgate.ORG

Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408926
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste