webForumDet fria alternativet

Problem med global.asa

ASPur ASP

14 svar · 446 visningar · startad av oskars

Medlem sedan nov. 20051 317 inlägg
Frågan#1

Hej på er =) Nu har jag kört fast!

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.

Vad har jag gjort för fel? :q

Tacksam för hjälp! :)

Oskar

Medlem sedan juni 200032 967 inlägg
#2

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.

Läs också emissions tråd om tomsträngskonkatering.

mvh

Medlem sedan apr. 20031 660 inlägg
#3

HEJ!

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.

Medlem sedan nov. 20051 317 inlägg
#4

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 =)

Medlem sedan juni 200032 967 inlägg
#5

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.

Medlem sedan nov. 20051 317 inlägg
#6

Vad är "användartabellen" för något? och vilket fält menar du? =) Du får ursäkta, är nybörjare!

edit:

bl.a det här händer vid login:

Session("id") = RecSet("userID")
Session("userName") = RecSet("userLoginName")
Session("inloggad") = 1
Session.Timeout = 10
RecSet("userLoginStatus") = "1"
Medlem sedan juni 200032 967 inlägg
#7

Vad är "användartabellen" för något?

Uhm, tblUsers, den du lagrar dina användare i?

och vilket fält menar du?

Det nya fält du skapar i tabellen som skall innehålla sessions-id:t.

Medlem sedan nov. 20051 317 inlägg
#8

jaha åfan...

så t.ex

RecSet("userSessionID") = Session.SessionID

och sen i global.asa... hur ska jag göra där?

Medlem sedan juni 200032 967 inlägg
#9

så t.ex

RecSet("userSessionID") = Session.SessionID

Till exempel.

och sen i global.asa... hur ska jag göra där?

Det försökte jag ju beskriva i mitt första inlägg i denna tråd. Testa och försök. :)

Medlem sedan apr. 20031 660 inlägg
#10

oskars skrev:

...
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>
Medlem sedan nov. 20051 317 inlägg
#11

*Do'h* Lite ivrig här. Sorry :D

Så det räcker alltså med dessa rader för att uppdatera någonting i databasen:


Set Connect = Server.CreateObject("ADODB.Connection")
Connect.Open "Driver={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath("databasen.mdb")

strSQL = "UPDATE tblUsers SET userLoginStatus = 0 WHERE userSessionID = " & Session.SessionID
Connect.Execute strSQL,,128

Connect.Close
Set Connect = Nothing
Medlem sedan juni 200032 967 inlägg
#12

Så det räcker alltså med dessa rader för att uppdatera någonting i databasen:

Jepp, ser bra ut! (y)
(under förutsättning att sessionsid-fältet är av taltyp förstås.)

Jag hade också bytt anslutningstyp till OLEDB, men det kan vi ta sedan.

Medlem sedan feb. 200112 078 inlägg
#13

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.

Läs mer här, i min grundliga undersökning av just detta problem.

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.

/red. Applikationsvariabel! Inte session. ;)

Medlem sedan nov. 20051 317 inlägg
#14

mina vänner... Jag försöker förstå så gott jag kan =)

override, ska jag skriva så här i OnStart?

application("strConn") = "Provider=Microsoft.JET.OLEDB.4.0;Data Source=" & server.mappath("/dir/dir/sökvägen.mdb")

men hur ska jag skriva om min Server.MapPath?

EDIT:
så här kanske?

Set Connect = Server.CreateObject("ADODB.Connection")
Connect.Open "Driver={Microsoft Access Driver (*.mdb)}; DBQ=" & application("strConn")

strSQL = "UPDATE tblUsers SET userLoginStatus = 0 WHERE userSessionID = " & Session.SessionID
Connect.Execute strSQL,,128

Connect.Close
Set Connect = Nothing

Medlem sedan juni 200032 967 inlägg
#15

override, ska jag skriva så här i OnStart?

Jag är inte override, men jag svarar ändå. ;)
Jepp, i **application_**onstart.

men hur ska jag skriva om min Server.MapPath?

Lägger du den i application_onstart behöver du inte skriva om den.

så här kanske?

Nästan. I open-raden räcker detta:

Connect.Open Application("strConn")

mvh

142 ms totalt · 3 externa anrop · v20260731065814-full.4bcf49fe
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
139 ms — hämta tråd, inlägg och bilagor (db)