Avatar billede krel Nybegynder
18. marts 2008 - 11:42 Der er 22 kommentarer og
1 løsning

logud uden om databasen

Hey derude...
jeg har et lille login system som også tæller hvem der er online.. det virkert alt sammen meget godt...

...hvis altså lige at folk husker at logge sig ud inden de lukker browseren eller besøger en ny side i samme vindue..

Jeg har nemlig lavet min online-status sådan at den sættes til true når en person logger ind via login.asp og til false igen når en person logger ud via logout.asp

tror lidt at hvis jeg nu brugte sessions i stedet kunne dette løse mit problem da man kan sætte en timeout for sessions (ikke?) eller at session'en lukkes/brydes hvis siden forlades (eller?)

jeg kan bare ikke lige se hvordan jeg så skal skrive disse sessions når en bruger skal se om andre brugere er online..

HJÆLP!?
mvh.
Kristian
Avatar billede fennec Nybegynder
18. marts 2008 - 11:58 #1
Når de logger ind gemmer du så ikke et ID på dem i en session??

Du skal så bare ind i global.asa filen og lave en Session_OnEnd funktion som logger brugeren af. Den bliver kørt hver gang session udløber.

SUB Session_OnEnd
...kode til logaf...
END SUB
Avatar billede krel Nybegynder
18. marts 2008 - 12:01 #2
jo jeg har en id på hver enkelt bruger... men hvordan gør jeg så når jeg under vis brugere skal vise om de forskellige brugere er online??

nu har jeg jo bare if databesefelt online = true then online else offline...
(i hurtig form c",)
Avatar billede fennec Nybegynder
18. marts 2008 - 12:15 #3
Alt den kode bibeholder du bare. Det eneste du skal gøre er at smide dit logud script i global.asa

SUB Session_OnEnd
  Set Conn = Server.CreateObject("ADODB.Connection")
  Conn.Open "DBString"
  conn.execute("update brugerTabel set online=false where id="& session("ID"))
  conn.close
END SUB

Hvis brugeren glemmer at logge af, sker det automatisk når session udløber (efter ca 15 min)
Avatar billede krel Nybegynder
18. marts 2008 - 12:18 #4
arh... nu kan jeg se det....
ved ikke hvorfor men have ikke lige overvejet ...kode til logaf... dvs når sessionen ender køres logout siden auto og derved logges bruger af som hvis han selv havde linket til lgout via log ud linket på siden... SEJT

-svar->
Avatar billede fennec Nybegynder
18. marts 2008 - 12:28 #5
Det er det nemlig :o)

Global.asa kan mange smarte ting med Session og Application. Både når de startes og sluttes. Søg her på E og google hvis du vil lære mere. Mange bruger f.eks Application til at styre en "online liste".

.o) <-- One Eyed Jack
Avatar billede krel Nybegynder
18. marts 2008 - 12:41 #6
hmmm ja så får jeg et lille problem...

min logout ser nemlig sådan ud og den er global.asa ikke så glad for...
<% session.LCID=1030
Response.Buffer = True
dtmDate = Request.QueryString("date")
dtmToday = Date
If dtmDate = "" Then
dtmDate = Date
Else
dtmDate = CDate(dtmDate)
End if
intYear = Year(dtmDate)
strMonth = MonthName(Month(dtmDate))
intDayOfMonth = Day(dtmDate)
dtmFirstDate = DateAdd("d", (-intDayOfMonth)+1, dtmDate)
intFirstDay = Weekday(dtmFirstDate, vbMonday)
Function MyFormatDateTime(dato, datoFormat)
MyFormatDateTime = FormatDateTime(dato, datoFormat)
End Function
Set Conn = Server.CreateObject("ADODB.Connection")
DSN = "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath ("/fpdb/kongeloge.mdb")
Conn.Open DSN
function DBDate(fDate)
DBDate = right("0"&month(fDate),2) &"-"& right("0"&day(fDate),2) &"-"& year(fDate)
end function
SQL = "UPDATE [konge] SET [sidstonline] = ('"& DBDate(dtmdate) &"'), [online] = 0 WHERE [id] = "&Session("id")
Set rs = Conn.Execute(SQL)
Conn.Close
Set Conn = Nothing
Session.Abandon
Response.redirect "../index.asp"
%>
Avatar billede fennec Nybegynder
18. marts 2008 - 13:08 #7
Ja du bliver nød til at tilpasse den til global.asa

Koden kan dog gøres meget kortere:

SUB Session_OnEnd
  Set Conn = Server.CreateObject("ADODB.Connection")
  DSN = "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath ("/fpdb/kongeloge.mdb")
  Conn.Open DSN
  conn.execute("UPDATE [konge] SET [sidstonline] = date(), [online] = 0 WHERE [id] = "&Session("id"))
  conn.close
END SUB
Avatar billede krel Nybegynder
18. marts 2008 - 13:18 #8
nu har jeg ændret den til det du siger men når jeg logger ind på siden
(cheker at online bliver sat til 1 i db'en -> lukker db'en igen) lukker browseren (alt+F4) og tjekker db'en igen her er online stadig 1 og ikke 0 som den ellers skulle være....

? skal man tilføje mere i global.asa ?
Avatar billede fennec Nybegynder
18. marts 2008 - 13:23 #9
Nej. Funktionen bliver først kørt når session udløber. Det sker normalt 15-20 min efter brugeren sidst har loaded en side.

Du vil derfor først se den blive sat til 0 efter denne tid.

For tests skyld kan du dog sætte tiden ned. Det gør du ved bare at kalde denne linje et sted i din kode hvor du er sikker på den bliver kørt (f.eks login siden):

Session.timeout = 2 '<-- 2 min
Avatar billede krel Nybegynder
19. marts 2008 - 00:38 #10
nu har jeg siddet og ventet i op til 30 min efter jeg har lukket IE og når jeg så åbner min db er der ikke sket nogen ændring i online feltet (det er stadig = 1, i stedet for 0)

...
Avatar billede fennec Nybegynder
19. marts 2008 - 08:07 #11
Er din global.asa fil placeret rigtig i roden af dit site??

Prøv evt om den overhoved virker ved at sætte en session onstart:


SUB Session_OnStart
  session("GlobalAsaTest") = "Det virker"
END SUB

Lav så en test side hvor du skriver session("GlobalAsaTest") ud.
Avatar billede krel Nybegynder
19. marts 2008 - 23:22 #12
din test virker fint!
Avatar billede fennec Nybegynder
25. marts 2008 - 08:32 #13
Hvordan ser din Session_OnEnd kode helt præsis ud??
Avatar billede krel Nybegynder
25. marts 2008 - 10:17 #14
den i global.asa:

SUB Session_OnEnd
  Set Conn = Server.CreateObject("ADODB.Connection")
  DSN = "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath ("/fpdb/kongeloge.mdb")
  Conn.Open DSN
  conn.execute("UPDATE [konge] SET [sidstonline] = date(), [online] = 0 WHERE [id] = "&Session("id"))
  conn.close
Avatar billede fennec Nybegynder
25. marts 2008 - 10:35 #15
Ahh ja, OnEnd har vi jo ikke adgang til Server.MapPath, så du skal have den fulde sti indskrevet. Tjek den ved at lave en response.write Server.MapPath ("/fpdb/kongeloge.mdb"), og indskriv så den streng i DBQ. Bliver nok noget ala:

DSN = "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=C:\interpub\wwwroot\fpdb\kongeloge.mdb")

Vi kan også gemme værdien i Application også bruge den. OnStart har vi nemlig adgang til Server.MapPath:

Sub Application_OnStart
  Application("DNS") = "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath ("/fpdb/kongeloge.mdb")
End Sub

SUB Session_OnEnd
  Set Conn = Server.CreateObject("ADODB.Connection")
  Conn.Open Application("DNS")
  conn.execute("UPDATE [konge] SET [sidstonline] = date(), [online] = 0 WHERE [id] = "&Session("id"))
  conn.close
End Sub
Avatar billede krel Nybegynder
27. marts 2008 - 00:18 #16
Nu ser det sådan ud:
SUB Session_OnEnd
  Set Conn = Server.CreateObject("ADODB.Connection")
  DSN = "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=D:\Domains\tourdefoxdecarvalho.dk\wwwroot\fpdb\kongeloge.mdb"
  Conn.Open DSN
  conn.execute("UPDATE [konge] SET [sidstonline] = date(), [online] = 0 WHERE [id] = "&Session("id"))
  conn.close
END SUB

--> men det virker altså stadig ikke, har ventet i +20min og så kigget i dben hvor jeg stadig står som online.... skal det stå et bestemt sted i global.asa
Avatar billede fennec Nybegynder
27. marts 2008 - 08:18 #17
Doh... Variablerne skal jo dim's:

SUB Session_OnEnd
  DIM Conn, DSN
  Set Conn = Server.CreateObject("ADODB.Connection")
  DSN = "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=D:\Domains\tourdefoxdecarvalho.dk\wwwroot\fpdb\kongeloge.mdb"
  Conn.Open DSN
  conn.execute("UPDATE [konge] SET [sidstonline] = date(), [online] = 0 WHERE [id] = "&Session("id"))
  conn.close
END SUB
Avatar billede krel Nybegynder
19. april 2008 - 12:30 #18
det virker bare simpelthen hen ikke.. nu har jeg prøvet at logge på siden, lukkede vinduet (explorer) og derefter lukkede computeren og da jeg tændte for computeren næste morgen og åbnede databasen var jeg stadig online....? kan man ikke gøre noget uden om .asa?

- har det nogen indflydelse at jeg lave det i FP2003? der generes jo auto. en global.asa fil. Alternativt hvordan laves denne selv?

/Kristian
Avatar billede fennec Nybegynder
21. april 2008 - 12:53 #19
Du har kun global.asa som mulighed. Jeg kan dog ikke forstå det ikke fungere for dig. Jeg har lavet en test her:
http://henriknygaard.dk/experten/824189/test.mdb

login er bruger1/pass1, bruger2/pass2 osv.

Databasen kan hentes her:
http://henriknygaard.dk/experten/824189/test.mdb

Index.asp kan ses her:
http://henriknygaard.dk/experten/824189/index.txt

global.asa kan ses her:
http://henriknygaard.dk/global.txt

Bemærk at global.asa er placeret i roden af mit site og ikke inde i /experten/824189 mappen.

Bemærk også at jeg ved logout bare kalder session.abandon. Det skaber automatisk et kald til session_onEnd som logger mig ud. Jeg kan også bare vente i lidt over et min så bliver jeg også logget ud.
Avatar billede fennec Nybegynder
21. april 2008 - 12:54 #20
Hov. Der kom to links til databasen. Test lokationen er selvfølgelig:
http://henriknygaard.dk/experten/824189/index.asp
Avatar billede krel Nybegynder
27. april 2008 - 12:56 #21
hmm kan godt se hvordan det funger på din side...
Men mit login er bygget en smule anderledes op, for jeg har en side hvor data indtastet (name+pass) og så en tjek side der kun er asp - altså  tjekker data i db'en så kan ikke lige gennemskue hvordan jeg kan flette dit system ind på min tjek-side..

så har jeg en if session("logemedlem") <> true så redirectes der til login-siden..
Avatar billede fennec Nybegynder
28. april 2008 - 09:43 #22
Hvordan dit login fungere er irelevant i forbindelse med logout via global.asa. Så længe du bare gemmer brugerens database id i en session.

Det eneste du skal gøre er at tage global.asa fra mit eks og smide på dit site. Rette Application("db") til at pege på din database, også rette "Update brugere Set online = 0 Where Id = "&Session("id") så den passer med dine tabel/kolonne navne.
Avatar billede krel Nybegynder
28. april 2008 - 16:58 #23
hmmm har flere db'er på min root så er ikke så meget for bare at bytte rundt... men nu ligger tråden her og når så det kan lade sig gøre vil jeg prøve.. kan se det virker hos dig og som du siger skal det også virke hos mig...

men takker for tiden og kode eks. og vil kigge på det senere, lukker nu måske stiller spm som efterhånden som jeg får kigget på det.
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