Session_onend överskattat
Har samma problem och det går nog inte att lösa eftersom Session_onend exekveras bara när man antingen kör Session.Abandon eller när Session.TimeOut träder in. :l
20 svar · 495 visningar · startad av Nisseman
Nu har jag sökt igenom forumet men inte hittat nån lösning på mitt problem. Jag vill att användaren ska raderas ur databasen när den inte längre är aktiv på sidan.
Här är delar av min global.asa
Sub Session_OnEnd
Application("aktiva") = Application("aktiva") - 1
Set databas = Server.CreateObject("ADODB.Connection")
mdbpath = Server.MapPath("*****.mdb")
databas.Open "Driver={Microsoft Access Driver (*.mdb)}; DBQ=" & mdbpath & ";"
ip=Request.ServerVariables("REMOTE_ADDR")
SQL = "DELETE * FROM online WHERE ip = '"& ip &"'"
SET data = databas.Execute(SQL)
End Sub
Aktiva verkar fungera, men besökarna försvinner inte ur databasen, vad är fel?
Session_onend överskattat
Har samma problem och det går nog inte att lösa eftersom Session_onend exekveras bara när man antingen kör Session.Abandon eller när Session.TimeOut träder in. :l
min global.asa
<SCRIPT LANGUAGE="VBScript" RUNAT="Server">
Sub Application_OnStart
Application("aktiva") = 0
End Sub
Sub Application_OnEnd
Application("aktiva") = 0
End Sub
Sub Session_OnStart
Application("aktiva") = Application("aktiva") + 1
id=session.sessionID
ip=Request.ServerVariables("REMOTE_ADDR")
namn = "undknown"
datum = date & " " & time
info = "undknown"
besok = 0
Set databas = Server.CreateObject("ADODB.Connection")
mdbpath = Server.MapPath("*****.mdb")
databas.Open "Driver={Microsoft Access Driver (*.mdb)}; DBQ=" & mdbpath & ";"
SQL = "SELECT * FROM namn WHERE ip = '"& ip &"'"
SET data = databas.Execute(SQL)
IF NOT data.eof THEN
namn = data("namn")
info = data("info")
besok = data("besok")+1
SQL = "DELETE * FROM namn WHERE ip = '"& ip &"'"
SET data = databas.Execute(SQL)
SQL = "DELETE * FROM online WHERE ip = '"& ip &"'"
SET data = databas.Execute(SQL)
END IF
SQL = "INSERT INTO namn(ip,namn,info,besok,senaste) VALUES('"& ip &"','"& namn &"','-','"& besok &"',#"& datum &"#)"
SET data = databas.Execute(SQL)
SQL = "INSERT INTO online(sessid,ip,namn) VALUES('"& id &"','"& ip &"','"& namn &"')"
SET data = databas.Execute(SQL)
Set databas = Server.CreateObject("ADODB.Connection")
mdbpath = Server.MapPath("\db\counter.mdb")
databas.Open "Driver={Microsoft Access Driver (*.mdb)}; DBQ=" & mdbpath & ";"
SQL = "SELECT * FROM counter WHERE id = 'server' "
SET data = databas.Execute(SQL)
antalBES = data("antal") + 1
senaste = data("senaste")
datum = date & " " & time
SQL = "DELETE * FROM counter WHERE id = 'server' "
SET data = databas.Execute(SQL)
SQL = "INSERT INTO counter(id,antal,senaste) VALUES('server','"& antalBES &"',#"& datum &"#)"
SET data = databas.Execute(SQL)
End Sub
Sub Session_OnEnd
Application("aktiva") = Application("aktiva") - 1
Set databas = Server.CreateObject("ADODB.Connection")
mdbpath = Server.MapPath("*****.mdb")
databas.Open "Driver={Microsoft Access Driver (*.mdb)}; DBQ=" & mdbpath & ";"
ip=Request.ServerVariables("REMOTE_ADDR")
SQL = "DELETE * FROM online WHERE ip = '"& ip &"'"
SET data = databas.Execute(SQL)
End Sub
</SCRIPT>
Som jag sa så har jag redan testat det, men det hjälpte inte...
Kan det vara att jag varken får ip eller id från datorn i session_onend?
Testa....
Testa att ta bort allt utan Application("aktiva") = Application("aktiva") - 1 i Session_Onend
Sen så rekomenderar jag att låsa när du skriver till en applikation så att det inte uppstår något problem om två samtidigt ändrar i applikationen...
ex.
Application.Lock
Application("aktiva") = Application("aktiva") - 1
Application.UnLock
Lägg Application_OnEnd efter Session_OnEnd
Kan ibland strula om de inte ligger i "körordningen"
cya,
PatrikB
När du ändrar i global.asa så måste man starta om siten för att global.asa ska ta ändringarna på en gång.
Om man inte har tillgång till servern så kan man ta bort global.asa från wwwroot och sedan gå in på sidan. Ladda upp global.asa igen och sedan ytterligare gå in på sidan så laddas den nyss uppladdade global.asa filen.
cya,
PatrikB
Här är min uppdaterade global.asa, application("aktiva") och application("INaktiva") fungerar.
Det verkar som att den slutar i session_onend då jag försöker hämta sessionID för de andra sakerna som ska göras efter det görs inte, då undar jag om man inte kan hämta session.ID och remote_addr i session_onend?
<SCRIPT LANGUAGE="VBScript" RUNAT="Server">
Sub Application_OnStart
Application("aktiva") = 0
Application("INaktiva") = 0
End Sub
Sub Session_OnStart
Application.Lock
Application("aktiva") = Application("aktiva") + 1
Application.UnLock
session.timeout = 1
id=session.sessionID
ip=Request.ServerVariables("REMOTE_ADDR")
namn = "undknown"
datum = date & " " & time
info = "undknown"
besok = 0
Set databas = Server.CreateObject("ADODB.Connection")
mdbpath = Server.MapPath("*****.mdb")
databas.Open "Driver={Microsoft Access Driver (*.mdb)}; DBQ=" & mdbpath & ";"
SQL = "SELECT * FROM namn WHERE ip = '"& ip &"'"
SET data = databas.Execute(SQL)
IF NOT data.eof THEN
namn = data("namn")
info = data("info")
besok = data("besok")+1
SQL = "DELETE * FROM namn WHERE ip = '"& ip &"'"
SET data = databas.Execute(SQL)
SQL = "DELETE * FROM online WHERE ip = '"& ip &"'"
SET data = databas.Execute(SQL)
END IF
SQL = "INSERT INTO namn(ip,namn,info,besok,senaste) VALUES('"& ip &"','"& namn &"','-','"& besok &"',#"& datum &"#)"
SET data = databas.Execute(SQL)
SQL = "INSERT INTO online(sessid,ip,namn) VALUES('"& id &"','"& ip &"','"& namn &"')"
SET data = databas.Execute(SQL)
Set databas = Server.CreateObject("ADODB.Connection")
mdbpath = Server.MapPath("*****.mdb")
databas.Open "Driver={Microsoft Access Driver (*.mdb)}; DBQ=" & mdbpath & ";"
SQL = "SELECT * FROM counter WHERE id = 'server' "
SET data = databas.Execute(SQL)
antalBES = data("antal") + 1
senaste = data("senaste")
datum = date & " " & time
SQL = "DELETE * FROM counter WHERE id = 'server' "
SET data = databas.Execute(SQL)
SQL = "INSERT INTO counter(id,antal,senaste) VALUES('server','"& antalBES &"',#"& datum &"#)"
SET data = databas.Execute(SQL)
End Sub
Sub Session_OnEnd
Application.Lock
Application("aktiva") = Application("aktiva") - 1
Application("INaktiva") = Application("INaktiva") + 1
Application.UnLock
ip=Request.ServerVariables("REMOTE_ADDR")
id=session.sessionID
Application("ip") = ip
Application("id") = id
Set databas = Server.CreateObject("ADODB.Connection")
mdbpath = Server.MapPath("*****.mdb")
databas.Open "Driver={Microsoft Access Driver (*.mdb)}; DBQ=" & mdbpath & ";"
datum = date & " " & time
SQL = "DELETE * FROM online WHERE ip = '"& ip &"'"
SET data = databas.Execute(SQL)
SQL = "INSERT INTO offline(sessid,ip,datum) VALUES('"& id &"','"& ip &"',#"& datum &"#)"
SET data = databas.Execute(SQL)
End Sub
Sub Application_OnEnd
Application("aktiva") = 0
End Sub
</SCRIPT>
I session_onEnd så finns det inget request-objekt.
Det du kan göra är att lagra värdet för remote_addr i en session-variabel, t.ex. vid session_onStart.
Det fungerade att lagra men databasen får fortfarande inget
Kan man inte ändra i databaser i session_onend?
Jo, det ska inte vara några problem, förutsatt att verkligen session_onend körs.
Hur ser din SQL-fråga ut nu, som du försöker köra i _onend?
Mvh,
Det är den som står med i global.asa men har tagit bort den nu eftersom den inte gjorde något och det verkade som min session_onend genererade fel (enligt loggboken). Men jag skulle uppskatta om jag fick hjälp med att få igång den igen...
Såhär var min mening ungefär:
session_onstart:
session("userIP") = ip
session("datum") = datum
session_onend:
ip = session("userIP")
id = session.sessionID
datum = session("datum")
Set databas = Server.CreateObject("ADODB.Connection")
mdbpath = Server.MapPath("*****.mdb")
databas.Open "Driver={Microsoft Access Driver (*.mdb)}; DBQ=" & mdbpath & ";"
SQL = "INSERT INTO offline(sessid,ip,datum) VALUES('"& id &"','"& ip &"',#"& datum &"#)"
SET data = databas.Execute(SQL)
men det dyker inte upp nån data i databasen, jag är säker på att on end körs eftersom app("aktiva") ändras[KOD]
edit: kod taggarna var fel
Det kan inte vara något enkelt fel som att du t.ex. har satt sessid eller ip till tal i databasen. Isåfall ska det inte vara några ' runt '" & id & "' eller '" & ip & "'. Eller att kanske det blir fel datumtyp när den ska in i databasen....
Testa att köra SQL-satsen utanför global.asa och se om det funkar...
Testat nu och koden fungerade, synd...