Jag använder global.asa för att kolla antalet besökare just nu, samt för att göra lite ändringar i databasen när sessionen går ut... men det vill sig inte.
Så här ser min global.asa ut:
<SCRIPT LANGUAGE=VBSCRIPT RUNAT=SERVER>
SUB Application_OnStart
Application("besokare") = 0
END SUB
SUB Session_OnStart
Application("besokare") = Application("besokare") + 1
END SUB
SUB Session_OnEnd
Application("besokare") = Application("besokare") - 1
Set Connect = Server.CreateObject("ADODB.Connection")
Connect.Open "Driver={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath("dir/dir2/databas.mdb")
Set RecSet = Server.CreateObject("ADODB.Recordset")
RecSet.Open "Select * From tblUsers WHERE userID = " & Session("id") & "", Connect, 3, 3
Session("id") = ""
Session("inloggad") = 0
RecSet("userLoginStatus") = 0
RecSet.Update
RecSet.Close
Set RecSet = Nothing
Connect.Close
Set Connect = Nothing
END SUB
</SCRIPT>
Jag vill att när sessionen gått ut så ska userLoginStatus sättas till "0"... Men den gör inte det... Jag har så klart en logga ut-knapp som fungerar perfekt, men det är en annan historia... Den här lösningen är till för när medlemmarna inte loggar ut ordentligt utan bara stänger ned sin webläsare utan att klicka på logga ut-knappen först.
I session_onend har du, om jag minns rätt, inte tillgång till några sessionsvariabler, utan endast Session.SessionID.
Så, du får lagra session.sessionid i ett fält i användartabellen och använda det när du uppdaterar.
Och!
Det finns ingen anledning att öppna ett recordset för att uppdatera.
Kör en UPDATE-fråga direkt istället, typ:
strSQL = "UPDATE tblUsers SET userLoginStatus = 0 WHERE SessionID = " & Session.SessionID
Connect.Execute strSQL,,128
Det finns inte heller någon anledning att sätta sessionsvariabler i session_onend. Sätt dem i onstart istället.
Jag har aldrig gjort detta, och har kanske helfel. En sak är konstig; när session går ut, hur kan du då hämta personen med det id:t?
RecSet.Open "Select * From tblUsers WHERE userID = " & Session("id") & "", Connect, 3, 3
Det finns kodexempel som fixar besöksstatistik, men det har du säkert koll på.
Gör gärna lite snygga indrag också, då blir det enklare att läsa koden.
anders, hm, okej... jag hänger inte riktigt med.. jag har ju användar IDet i en kolumn i databasen.. kolumnen heter userID och innehåller användarens unika ID... är de det du menar? Gärna om du vill förklara lite enklare :)
J.N, jo jag har också funderat på det där! Ska testa Anders grej först =) tack
J.N, du skriver "Gör gärna lite snygga indrag också, då blir det enklare att läsa koden."... Visa gärna ett exmpel på hur jag kan tabba bättre =)
anders, hm, okej... jag hänger inte riktigt med.. jag har ju användar IDet i en kolumn i databasen.. kolumnen heter userID och innehåller användarens unika ID... är de det du menar?
Nej, det är inte det jag menar. Som jag skrev ovan, du har inte tillgång till några sessionsvariabler i session_onend, utan endast sessionsid:t, som är ett långt tal som tilldelats av webbservern för att webbservern ska kunna avgöra vilka sessionsvariabler som tillhör vilken användare.
När användaren loggar in, spara Session.SessionID i ett fält i användartabellen. När session_onend inträffar, gör en update där du har detta sessions-id som villkor.
...
J.N, du skriver "Gör gärna lite snygga indrag också, då blir det enklare att läsa koden."... Visa gärna ett exmpel på hur jag kan tabba bättre =)
Okej, men det hade du fixat själv; det är ju endast ett indrag, och tre sub:ar
<SCRIPT LANGUAGE=VBSCRIPT RUNAT=SERVER>
SUB Application_OnStart
Application("besokare") = 0
END SUB
SUB Session_OnStart
Application("besokare") = Application("besokare") + 1
END SUB
SUB Session_OnEnd
Application("besokare") = Application("besokare") - 1
osv...
Connect.Close
Set Connect = Nothing
END SUB
</SCRIPT>
Du använder Server.MapPath i Session_OnEnd, vilket inte är möjligt. Eftersom script i t.ex. session_onend körs implicit i bakgrunden på servern, kommer du inte se några felmeddelanden, annat än ev. i Application Eventlog i Windows.
Som tråden beskriver; du får lagra en färdig, fysisk sökväg till databasen i en applikationsvariabel som du sätter i Application_OnStart istället. Då behöver du inte köra Server.MapPath i Session_OnEnd.