webForumDet fria alternativet

on_end i global.asa

ASP

20 svar · 495 visningar · startad av Nisseman

Medlem sedan jan. 2000189 inlägg
Frågan#1

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?

Medlem sedan juni 2001206 inlägg
#2

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

Medlem sedan jan. 2000189 inlägg
#3

Trist

Jag använder session.timeout = 1 men det blir inte bättre ändå :(

Medlem sedan mars 20002 836 inlägg
#4

Hur ser din global.asa ut från rad 1 till sista raden.

cya,
PatrikB

Medlem sedan jan. 2000189 inlägg
#5

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>
Medlem sedan juni 2001206 inlägg
#6

Testa med att skriva med

Session.Timeout =1

först i Session_onstart

Medlem sedan jan. 2000189 inlägg
#7

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?

Medlem sedan juni 2001206 inlägg
#8

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

Medlem sedan jan. 2000189 inlägg
#9

Tack för tipset

Men det är ju i huvudsak databasen jag vill åt... Nån med andra ideer?

Medlem sedan mars 20002 836 inlägg
#10

Lägg Application_OnEnd efter Session_OnEnd

Kan ibland strula om de inte ligger i "körordningen"

cya,
PatrikB

Medlem sedan jan. 2000189 inlägg
#11

Tyvärr

Så hjälpte det inte
Kan man inte skriva i databaser i session_onend?

Medlem sedan mars 20002 836 inlägg
#12

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

Medlem sedan jan. 2000189 inlägg
#13

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>
Medlem sedan dec. 200012 464 inlägg
#14

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.

Medlem sedan jan. 2000189 inlägg
#15

Det fungerade att lagra men databasen får fortfarande inget

Medlem sedan jan. 2000189 inlägg
#16

Kan man inte ändra i databaser i session_onend?

Medlem sedan juni 200032 967 inlägg
#17

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,

Medlem sedan jan. 2000189 inlägg
#18

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

Medlem sedan juni 2001206 inlägg
#19

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...

Medlem sedan jan. 2000189 inlägg
#20

Testat nu och koden fungerade, synd...

281 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
129 ms — deklarationer (db)
0 ms — hämta statistik (cache)
140 ms — hämta tråd, inlägg och bilagor (db)
138 ms — ändringar (db)