Avatar billede apo Praktikant
30. december 2004 - 20:08 Der er 37 kommentarer og
1 løsning

Reloadsikker statistik?

Hej.

Jeg er igang med at lave en statistik der viser antal hits og andre brugbare statistiske oplysninger om min artikelsektion. Via ASP tæller jeg antal besøgende pr. artikel, men har opdaget at hvis brugeren opdaterer siden, tæller opdateringen for et hit.

Spørgsmål: Hvordan undgår jeg at tælleren opdateres ved opdatering af vinduet, men således at tælleren stadig registrerer et hit hvis brugeren forlader siden og vender tilbage til artiklen igen (altså et ægte hit)?

Skal jeg bruge cookies, session.sessionID eller hvad... Hvordan løser jeg opgaven på den mest optimale måde?

Jeg vil gerne bede om eksempler på løsninger der kan anvendes :-)

Apo
Avatar billede Slettet bruger
30. december 2004 - 20:32 #1
hvis du tæller antal hits på den omtalte artikel vil jeg mene det er korrekt det du gør, hvorimod hvis det er antallet af unikke besøgende ville jeg lave en cookie der holder 20 min. og derefter tælle den pågældende som en ny besøgende.

hvis du vil have hits men ikke mere end et hits pr. artikel pr. bruger

ville jeg oprette en unik session for artiklen som du så tjekker på inden du tæller op.
Avatar billede softspot Forsker
30. december 2004 - 20:47 #2
Du kunne evt. checke på Request.ServerVariables("HTTP_REFERER") og se om den kommer fra samme side...
Avatar billede websam Nybegynder
30. december 2004 - 20:49 #3
Det er som ikke så svært du sætter blot følgende om din counter kode :

If Session("Count") = "" Then
  Session("Count") = "Hit"
  '--- Her indsætter du din kode !
End If

På den måde kan folk trykke F5 alt det der lyster dem og komme tilbage inde for samme session uden der tælles igen.

/Websam
Avatar billede Slettet bruger
30. december 2004 - 20:50 #4
softspot>>

vil jo ikke just virke med Request.ServerVariables("HTTP_REFERER")... så ville to forskellige artikler heller ikke tælle
Avatar billede Slettet bruger
30. december 2004 - 20:51 #5
websam>>

måske en ide at lave din session unik for hver artikel, hvis de statistikken omfatter hver enkelte artikel, ellers er den stump kode jo ikke meget værd
Avatar billede websam Nybegynder
30. december 2004 - 20:54 #6
Ja klart det var min session ved besøg på min forside jeg havde taget der du kalder den blot Session("art-1234") istedet for og med 1234 værende det id nummer artiklen har så skulle den være der :o)

/Websam
Avatar billede apo Praktikant
30. december 2004 - 20:59 #7
Det er vel egentlig antallet af unikke besøgende jeg vil tælle...

Men hvordan griber jeg det an når jeg viser alle artikler på den samme ASP-side (hvordan sikrer jeg at det kun er læste artikler der ikke registrerer den besøgende de næste 20 min.)?

Min kode ser således ud:

<%
  If Request.QueryString("ArtikelID") <> "" Then

    ' ÅBNER DATABASEN
      Set myConn = Server.CreateObject("ADODB.Connection")
      myConn.Open "DRIVER={Microsoft Access Driver (*.mdb)};DBQ=d:\web\db\artikler.mdb"

      strSQL = "SELECT * FROM Artikler WHERE (ID = " & Request.QueryString("ArtikelID") & ")"
      Set rs = myConn.Execute(strSQL)

    ' HENTER ID
      Set rs = Server.CreateObject("ADODB.RecordSet")
      strSQL = "SELECT * FROM Artikler WHERE (ID = " & Request.QueryString("ArtikelID") & ")"
      rs.Open strSQL, myConn, 1, 3

    ' OPDATERER DATA I DATABASEN OG HENTER ARTIKELDATA
      ShortDate = FormatDateTime(Now, vbShortDate)

      If Not (rs.BOF Or rs.EOF) Then
        rs("Hits") = rs("Hits") + 1
        rs("SidsteHit") = ShortDate

        strTitel          = rs("Titel")
        strOverskrift    = rs("Overskrift")
        strBlikfang      = rs("Blikfang")
        strForfatter      = rs("Forfatter")
        strDato          = rs("Dato")

      ' HENTER ARTIKELINDHOLD
        strArtikelIndhold = rs("ArtikelIndhold")
        rs.Update

      ' LUKKER DATABASEN
        rs.Close
        myConn.Close
        Set rs = Nothing
        Set myConn = Nothing
        Response.Clear
      End If
  End If
%>

Og hvor meget belaster jeg serveren ved f.eks. at anvende sessions på den måde (ved flere besøgende på én gang)?

Apo
Avatar billede softspot Forsker
30. december 2004 - 21:03 #8
guestis > afhænger det ikke af hvordan dit request ser ud... Hvis nu artiklen findes ved at siden kaldes med en parameter (f.eks. artikelid=897362), så ville det vel fungere... eller hvad?
Avatar billede Slettet bruger
30. december 2004 - 21:03 #9
du kunne evt. logge brugerens besøgstid samt artikel id i en database + have en tabel du tæller op for hver artikel alt efter om den besøgende opfylder kravet til at være unik ud fra log tabellen i databasen, derved er det database serveren der får lidt at lave istedet for webserveren... ville jeg nok foretrække
Avatar billede apo Praktikant
30. december 2004 - 21:07 #10
questis > Jeg har ikke adgang til en decideret database server :-/ Som du kan se i min kode bruger jeg Access-database (mdb).

Apo
Avatar billede softspot Forsker
30. december 2004 - 21:08 #11
Apo > Hvordan ser din url til de enkelte artikler ud?
Avatar billede Slettet bruger
30. december 2004 - 21:09 #12
ville nok stadig bruge databasen til at lagre det i da det kan bliver til ufatteligt mange sessions hvis blot et par brugere suser lidt rundt på siden
Avatar billede apo Praktikant
30. december 2004 - 21:14 #13
softspot > Sådan her:

VisArtikel.asp?ArtikelID=X (X = ID).
Avatar billede apo Praktikant
30. december 2004 - 22:57 #14
Men kan man ikke bruge Session.SessionID til noget? Så vidt jeg ved er det et unikt ID der tildeles den enkelte besøgende hver gang et nyt besøg foretages.
Avatar billede softspot Forsker
30. december 2004 - 23:12 #15
Ja, sessionID sættes påny første gang en bruger surfer ind på siden og når det er udløbet (typisk efter 20 min), så det kan kun benyttes til at se om en bruger har været på før i den aktuelle session.

Den bedste løsning ser for mig også (guestis sagde det vist tidligere) ud til at være en databaseløsning, så du ikke fylder serverhukommelsen op med session-variable. Access kan stadig benyttes til at optælle besøg (selvom den nok kommer til at give problemer med skalerbarheden, men det kan du jo tage til den tid...).

Hvis du vil huske brugere på tværs af sessions skal du nok bruge en cookie som identificerer brugeren i en længere periode end deres session varer...

Mit eget forslag med HTTP_REFERER fra tidligere fungerer heller ikke, hvis du vil have unikke besøg (med ud fra den oprindelig beskrivelse mener jeg stadig at det havde fungeret :)).
Avatar billede apo Praktikant
31. december 2004 - 00:16 #16
Hmm... Der må være en anden måde end den med databasen :-/

Vil det optage for mange serverressourcer, hvis jeg fylder artikelID'erne ind i en session, på en måde a'la det her:

Session.SessionID = "1, 3, 5, 7, 56, 57"

Og henter Id'erne ved at splitte dem ved kommaerne?
Avatar billede Slettet bruger
31. december 2004 - 00:19 #17
det kunne også være en udemærket ide, og dejlig nem at arbejde med
Avatar billede apo Praktikant
31. december 2004 - 00:21 #18
Men vil det være for ressourcekrævende? Og hvor mange brugere vil jeg kunne have ad gangen på den måde, før serverens hastighed bliver påvirket?
Avatar billede Slettet bruger
31. december 2004 - 00:23 #19
Jeg vil faktisk tro at denne metode ville være mindre resource krævende end den med databasen, havde slet ikke tænkt på at liste dem da jeg kom med forslag.

hvor mange brugere du kan have online tror jeg ikke du skal bekymre dig om hvis det kun drejer sig om en enkelt session for hver bruger
Avatar billede softspot Forsker
31. december 2004 - 00:26 #20
Men skulle du ikke vide hvormange der besøgte den enkelte artikel? I så fald skal du vel også have noget information om brugeren med i din streng...?
Avatar billede Slettet bruger
31. december 2004 - 00:28 #21
hvorfor skal der noget infor om brugeren med i strengen, strengen skal blot bruges til at tjekke om brugeren har været der før, hvis ikke opdateres databasen med en og session bliver opdateret med et ekstra id
Avatar billede softspot Forsker
31. december 2004 - 00:28 #22
Aaaah, sooooory! my bad - var lidt for hurtig på aftrækkeren...
Avatar billede apo Praktikant
31. december 2004 - 00:38 #23
Jeg har allerede tælleren parat (kan ligeledes ses i mit tidligere kodeeksempel):
<%
...
rs("Hits") = rs("Hits") + 1
rs("SidsteHit") = ShortDate
...
%>

I ovenstående eksempel opdaterer jeg 'Hits' og 'SidsteHit' i den samme database hvor artiklerne ligger i. Det jeg vil er at filtrere hit-tælleren, så den ikke ukritisk opdaterer statistikken, hvis brugeren f.eks. opdaterer siden.

På den måde håber jeg at få en nogenlunde realistisk statistik over interessen for de enkelte artikler (hvilke er hot, og hvilke er not) :-)

Men min idé med at fylde ID'erne i en liste i en session er måske ikke tosset?
Avatar billede Slettet bruger
31. december 2004 - 00:40 #24
jeg ville nok bruge ideen med den session, kan jo laves rimeligt hurtigt og effektiviteten har du jo allerede stået for ;O)
Avatar billede apo Praktikant
31. december 2004 - 00:46 #25
Hvis I kan smide et eksempel på hvordan det kan laves (både indsætte ID'erne i session og splitte dem op igen) er der points...

Jeg er nemlig ikke helt sikker på hvordan jeg skal lave det :-)
Avatar billede Slettet bruger
31. december 2004 - 00:49 #26
' smide noget ekstra i din session
Session("hat") = Session("hat") & "57"

' spiltter en session ved komma
a=Split(session("ekstra" & VOGNKORTNR & ""),",")

    For i=0 to ubound(a)

   

      'lav tjek her for om bruger har været her

    next
Avatar billede Slettet bruger
31. december 2004 - 00:52 #27
' spiltter en session ved komma
a=Split(session("hat"),",")
    For i=0 to ubound(a)
        If a(i) = artikelid Then
          harvaerether = "ja"
        End IF
    next

    If harvaerether <> "ja Then
        'opdater db
        Session("hat") = Session("hat") & "artikelid"
    end if


noget i den stil
Avatar billede apo Praktikant
31. december 2004 - 00:56 #28
Kan du give en mere detaljeret forklaring på dit eksempel? Metoderne i dit eksempel er helt nye for mig :-)

Hvordan opdaterer jeg f.eks. en session med mere end et id?
Avatar billede Slettet bruger
31. december 2004 - 01:00 #29
' smide 1 ekstra id i session
Session("hat") = Session("hat") & ", 57"

' smide 2 ekstra id i session
Session("hat") = Session("hat") & ", 57, 61"

' spiltter en session ved komma op i et array for at vi kan arbejde med de enkelte tal
a=Split(session("hat"),",")
    For i=0 to ubound(a)
        If a(i) = artikelid Then
          harvaerether = "ja"
        End IF
    next

' Simpel if der tjekker resultatet ovenfor om der skal opdateres eller ej
    If harvaerether <> "ja Then
        'opdater db
        Session("hat") = Session("hat") & "artikelid"
    end if


men hvorfor skal du smide flere id ind på en gang ?
Avatar billede apo Praktikant
31. december 2004 - 01:03 #30
Jeg skal jo have indsat et artikelID for hver artikel brugeren har læst (så tælleren ikke registrerer flere hits på samme artikel, af samme bruger)?
Avatar billede Slettet bruger
31. december 2004 - 01:08 #31
ja, men du skal da kun ligge et id ind af gangen hvad denne gør:

Session("hat") = Session("hat") & ", 57"

den tager en session og sætter ", 57" i slutningen af den eksisterende session...

dvs.
vi har denne session inden brugeren kommer til en ny artikel med nummeret 57:
session("hat") = "45"

Så kører vi vores:

a=Split(session("hat"),",")
    For i=0 to ubound(a)
        If a(i) = 57 Then
          harvaerether = "ja"
        End IF
    next

da vores session ikke indeholder nummeret 57 vil harvaerether være tom:

derved vilden gå i følgende ifsætning:

    If harvaerether <> "ja Then
        'opdater db
        Session("hat") = Session("hat") & ", 57"
    end if

som opdaterer din database med en, og sætter 57 i slutningen af din session

hvis du udskriver session("hat") nu ville ud dataen være: 45, 57
Avatar billede apo Praktikant
31. december 2004 - 01:16 #32
Okay, nu begynder det at dæmre :-D

Hvis jeg nu skal overføre det til min egen kode, vil jeg vel skulle opdatere sessionen på denne måde:

If harvaerether <> "ja" Then
  ' Opdater database
  Session("ArtikelID") = Session("ArtikelID") & Request.QueryString("ArtikelID")
End If

Rigtigt?
Avatar billede Slettet bruger
31. december 2004 - 01:18 #33
ja næsten du skal lige huske at komma sepperere din session så den kan splittes ad igen ;O)

  Session("ArtikelID") = Session("ArtikelID") & "," & Request.QueryString("ArtikelID")
Avatar billede apo Praktikant
31. december 2004 - 01:21 #34
Ja, det har du jo ret i :-)

Så når brugeren åbner en ny artikel, skal det vel se sådan ud:

a=Split(session("ArtikelID"),",")
    For i=0 to ubound(a)
        If a(i) = Request.QueryString("ArtikelID") Then
          harvaerether = "ja"
        End IF
    next

Det må da være rigtigt? (hvis jeg ellers har forstået det korrekt)
Avatar billede Slettet bruger
31. december 2004 - 01:23 #35
jeps og så din if sætning bagefter som du sætter din funktion til at opdatere databasen ind i
Avatar billede apo Praktikant
31. december 2004 - 01:29 #36
Det er jo ikke mindre end genialt, og er samtidig rimelig simpelt!

Questis, læg et svar og modtag dine velfortjente points :-)
Avatar billede Slettet bruger
31. december 2004 - 01:31 #37
håber du fik det til at virke efter hensigten...
Avatar billede apo Praktikant
31. december 2004 - 01:37 #38
Jeg har ikke testet det endnu (jeg er for træt til at kode mere i nat), men jeg har forstået hvordan det fungerer, og kan se hvordan det skal laves; Det er det vigtigste...

Tak for din hjælp, og tak for tålmodigheden ;-)

// Lukker

Apo
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester