09. maj 2005 - 19:39Der er
33 kommentarer og 1 løsning
Hvem er online!
Hej eksperter,
Jeg skal bruge en funktion som skal fortælle mig hvilke brugere der sidst har logget ind på systemet. Top 15 evt. Udfra det skal det vises om de enten er online på siden eller offline.
Jeg har oprettet en tabel i min database der hedder online_offline. I den har jeg smidt 3 kolloner. user_id, online, offline. Det vil jo egentligt være ret nemt at definere hvornår folk går online, for det er jo bare at smide nogle oplysninger ind i databasen når de logger ind. Men hvad så når de logger ud?
Umiddelbart kunne man jo sætte en funktion på, som skulle fungere således at når brugeren trykker på "Log ud" så bliver feltet i databasen opdateret. Men det dur jo ikke hvis brugeren så bare lukker browseren.
Så jeg kunne godt tænke mig noget hjælp her. Har tænkt mig at sætte kollonerne offline, online til true og false, samt at bruge global.asa.
Nogle der kan komme med noget hjælp? På forhånd tak
I din global.asa kan du kode din sletning i databasen under Session_OnEnd som en ganske normal sletning fra databasen Du skal dog være opmærksom på at Session_OnEnd først bliver kørt når sessionen dør! Dvs som standard efter tyve minutter Men så kører den også uanset om brugeren har lukket vinduet eller bare er inaktiv Desværre må du finde dig i at din top 15 vil vise brugere som online i de tyve minutter selvom de måske ikke er det
Mit foreslag vil være at du laver en log ud funktion som sletter sessionen Din Session_OnEnd vil da promte fange alle som logger ud. Tilbage hænger kun dem som lukker browseren
du skal have fat i global.asa (mener jeg den hedder i asp3.0), i session_start smider du bruger ID'et i databasen, samt smider true i online, eller hvordan du nu har tænkt dig at lave det, kan ikke helt se ideen med en online og en offline kolonne, jeg ville hellere have et ID, brugerID, online, LastSeen <- men det er op til dig..
I session_end smider du så koden der skal ske når brugeren forlader sitet, eller smider session objektet (logger ud)..
Du skulle så med en simpel select hente de online brugere, jeg har erfaret at med .Net 1.1 kan jeg ikke skrive til databasen i Session_end .. noget med nogle rettigheder, hvis det er gældende i asp også, så lav et array, og slet alle i arrayet i session_start...
ja men jeg kan ikke i session_end.. kun session_start, men jeg blander mig lige uden om :)... havde ikke lige set at der var kommet 3 besvarelser da jeg skrev min :) arbejder ikke så meget i asp længere..
Men skal stadig bruge lidt hjælp her. Smider user_id ind i databasen via session. Men hvordan laver jeg så en 'true' når de logger på, og hvordan får jeg feltet status til at opdatere sig til false, når de logger af???
busschou burde nok svare, men jeg tror ikke SSI (dine includes) virker server side, endvidere benytter du ikke <% %> når du allerede har erklaret det er vbscript..
men du vil få SQL fejl, da du bruger userid som primary key, folk kan jo godt besøge siden flere gange, derfor.. lav et ID og et BRUGERID.. sæt eventuelt et tidpunkt på så du kan se hvornår de sidst har været online..
Jeg er i tvivl om man kan bruge SSI .. men jeg tror det ikke Måden jeg ville gøre det på er følgende På din login side når de logger ind ville jeg oprette en session("id") med det userid de har i databasen. Derefter trigger din Session_OnStart -- Session_OnStart //din database forbindelse sql = "insert into status (user_id,status) values ("&session("id")&",true) conn.execute sql set conn = nothing End Sub --- tilsvarende i end Session_OnEnd //din database forbindelse sql = "update status set status = false where user_id = "&session("id") conn.execute sql set conn = nothing End Sub
Vælger at følge den sidste kommentar af Busschou. Er applaction_OnEnd det man bruger når browseren lukkes? I så fald, burde jeg da så flytte mit indhold fra Session_OnEnd op til Applaction_OnEnd, eller hvad?!
Bruger nu følgende kode, men får fejl: <SCRIPT LANGUAGE="VBScript" RUNAT="Server">
'Opkald til databasen Function opendb() Set conn = Server.CreateObject("ADODB.Connection") DNS = "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" + Server.MapPath("../temp/db/hmf.mdb") conn.Open(DNS) set opendb = conn End function
Function closedb () conn.close Set conn = nothing End Function
set conn = opendb()
Sub Application_OnStart End Sub
Sub Application_OnEnd End Sub
Session_OnStart sql = "insert into status (user_id,status) values ("&session("id")&",true) conn.execute sql set conn = nothing End Sub
Session_OnEnd
sql = "update status set status = false where user_id = "&session("id") conn.execute sql set conn = nothing End Sub
closedb()
</script>
Fejlen: Microsoft VBScript compilation error '800a0409'
Unterminated string constant
//global.asa, line 25
sql = "insert into status (user_id,status) values ("&session("id")&",true) --------------------------------------------------------------------------^
Application onstart køres når du uploader en ny global.asa eller når din server genstartes Application onend kører tilsvarende når serveren lukkes - mig bekendt
Nu får jeg denne fejl: Microsoft VBScript compilation error '800a0401'
Expected end of statement
//global.asa, line 25
sql = "insert into status (user_id, status) values ("&session("id")&",'true'") -----------------------------------------------------------------------------^
'Opkald til databasen Function opendb() Set conn = Server.CreateObject("ADODB.Connection") DNS = "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" + Server.MapPath("../temp/db/hmf.mdb") conn.Open(DNS) set opendb = conn End function
Function closedb () conn.close Set conn = nothing End Function
Sub Application_OnStart End Sub
Sub Application_OnEnd End Sub
Session_OnStart set conn = opendb() sql = "insert into status (user_id, status) values ("&session("id")&",'true')" set RSinsert = conn.Execute(SQL) set conn = nothing closedb() End Sub
Session_OnEnd set conn = opendb() sql = "update status set status = false where user_id = "&session("id") set RS = conn.execute(SQL) closedb() End Sub
bum bumelum... tænke tænke Det kan være fordi der ikke skal ' omkring true prøv sql = "insert into status (user_id, status) values ("&session("id")&",true)"
hmm kan du udskrive den? sql = "insert into status (user_id, status) values ("&session("id")&",true)" response.write sql ... har du sat session("id") ?
Havde godt nok glemt at sætte min session til memberid, men jeg får stadig fejl. Min kode ser nu sådan her ud:
<SCRIPT LANGUAGE="VBScript" RUNAT="Server">
'Opkald til databasen Function opendb() Set conn = Server.CreateObject("ADODB.Connection") DNS = "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" + Server.MapPath("../temp/db/hmf.mdb") conn.Open(DNS) set opendb = conn End function
Function closedb () conn.close Set conn = nothing End Function
Sub Application_OnStart End Sub
Sub Application_OnEnd End Sub
Sub Session_OnStart set conn = opendb() sql = "insert into status (user_id, status) values ("&session("id")&",true)" set RSinsert = conn.Execute(SQL) set conn = nothing closedb() End Sub
Sub Session_OnEnd set conn = opendb() sql = "update status set status = false where user_id = "&session("id") set RS = conn.execute(SQL) closedb() End Sub
Okay - har lavet lidt om det nu. Istedet for at oprette en tabel i databasen, har jeg bare oprettet et felt i members, hvor datatypen bliver sat til Ja/Nej. Når jeg så logger ind sætter jeg følgende script op, men feltet online bliver ikke opdateret. hvorfor?
SQL = "UPDATE members SET lastlogin = '" & now() & "' , online = false WHERE id = " & RSfound("id")
Lukker. Fandt en artikel på active developer der kunne hjælpe mig!
Tak for jeres tid anyway!
Synes godt om
Ny brugerNybegynder
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.