Avatar billede ban_me Nybegynder
09. maj 2005 - 19:39 Der 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
Avatar billede busschou Praktikant
09. maj 2005 - 19:49 #1
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
Avatar billede busschou Praktikant
09. maj 2005 - 19:50 #2
Din global.asa ser som standard sådan her ud
---
<script language=”VBScript” runat=”server”>
Sub Application_OnStart
End Sub

Sub Application_OnEnd
End Sub

Sub Session_OnStart
End Sub

Sub Session_OnEnd
// kode som køres når sessionen slutter
End Sub
</script>
Avatar billede busschou Praktikant
09. maj 2005 - 19:51 #3
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
Avatar billede jokkejensen Novice
09. maj 2005 - 19:51 #4
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...
Avatar billede busschou Praktikant
09. maj 2005 - 19:54 #5
jokkejensen >> Man kan sagtens tilgå databasen i global.asa i asp.. i alt fald hos mig :o)
Avatar billede jokkejensen Novice
09. maj 2005 - 19:57 #6
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..
Avatar billede ban_me Nybegynder
09. maj 2005 - 20:14 #7
NU har jeg lavet min tabel lidt om:

onlinestatus:
user_id (tal)
status (Ja/Nej)

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


<script language=”VBScript” runat=”server”>
<!--#include file="temp/includes/functions.asp" -->
<!--#include file="temp/includes/pageloader.asp" -->
Sub Application_OnStart
<%
SQL = "INSERT INTO status(user_id, status) VALUES("
SQL = SQL & RSfound("id") & ",'"   
set RSinsert = conn.Execute(SQL)
%>

SQL = "INSERT INTO user_id, status"
End Sub

Sub Application_OnEnd
End Sub

Sub Session_OnStart
End Sub

Sub Session_OnEnd

End Sub
</script>
Avatar billede jokkejensen Novice
09. maj 2005 - 20:23 #8
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..
Avatar billede jokkejensen Novice
09. maj 2005 - 20:25 #9
kig eventuelt her : http://activedeveloper.dk/artikler/default.asp?articleid=131

Der er det skåret lidt ud i pap.. erstat så :

' Skriv kode som skal køres når en session starter
Med et SQL kald til databasen om brugeren er online

og erstat :

' Skriv kode som skal køres når en session afsluttes
Med et SQL kald til databasen om brugeren er offline..


Inden include file... lav dine db connections i global.asa
Avatar billede jokkejensen Novice
09. maj 2005 - 20:26 #10
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..
Avatar billede busschou Praktikant
09. maj 2005 - 20:27 #11
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
Avatar billede ban_me Nybegynder
09. maj 2005 - 20:46 #12
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)
--------------------------------------------------------------------------^
Avatar billede jokkejensen Novice
09. maj 2005 - 20:50 #13
applikation end er når din applikation ikke køre, altså ingen brugere...

prøv med:

sql = "insert into status (user_id, status) values ('"&session("id")&"','true')

access er glad for ' tegnene :)... husk at "skjule" din database streng..
Avatar billede busschou Praktikant
09. maj 2005 - 20:50 #14
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
Avatar billede busschou Praktikant
09. maj 2005 - 20:51 #15
sql = "insert into status (user_id, status) values ("&session("id")&",'true'")
Avatar billede busschou Praktikant
09. maj 2005 - 20:52 #16
Jeg er ikke sikker på om der skal "plinger" ' omkring sandhedsværdier.
Men der manglede en " til sidst :o)
Avatar billede busschou Praktikant
09. maj 2005 - 20:53 #17
Din databasse forbindelse skal nok åbnes hver gang og lukkes hver gang.
Jeg er ikke sikker på det går godt når den "bare" står "udenfor"
Avatar billede ban_me Nybegynder
09. maj 2005 - 20:57 #18
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'")
-----------------------------------------------------------------------------^
Avatar billede busschou Praktikant
09. maj 2005 - 20:59 #19
argh pis..  sådan her.. sorry
sql = "insert into status (user_id, status) values ("&session("id")&",'true')"
Avatar billede ban_me Nybegynder
09. maj 2005 - 21:04 #20
Så får jeg denne fejl :)
Microsoft VBScript compilation  error '800a0400'

Expected statement

//global.asa, line 28

End Sub
^
Avatar billede jokkejensen Novice
09. maj 2005 - 21:11 #21
mangler du ikke også :

Session_OnStart
opendb()
closedb()
End Sub
Avatar billede ban_me Nybegynder
09. maj 2005 - 21:15 #22
Det vil jeg ikke mene. Min kode ser 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

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



</script>
Avatar billede busschou Praktikant
09. maj 2005 - 21:20 #23
Du bliver nød til at putte din database forbindelse ind i såvel session_onstart som session_onend ... den kan ikke ligge i det fri :o)
Avatar billede busschou Praktikant
09. maj 2005 - 21:21 #24
AHH
Sub Session_OnStart og Sub Session_OnEnd
og ikke Session_OnStart og Session_OnEnd
Avatar billede ban_me Nybegynder
09. maj 2005 - 21:24 #25
Jeg kan vel godt have den til at flyde i det fri, så længe jeg kalder den med en funktion, eller hvad?

Nu får jeg i hvert fald følgende fejl:
Microsoft OLE DB Provider for ODBC Drivers error '80040e14'

[Microsoft][ODBC Microsoft Access Driver] Syntax error in INSERT INTO statement.

//global.asa, line 27
Avatar billede busschou Praktikant
09. maj 2005 - 21:28 #26
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)"
Avatar billede ban_me Nybegynder
09. maj 2005 - 21:30 #27
Samme fejl :)
Avatar billede busschou Praktikant
09. maj 2005 - 21:33 #28
hmm kan du udskrive den?
sql = "insert into status (user_id, status) values ("&session("id")&",true)"
response.write sql
...
har du sat session("id") ?
Avatar billede ban_me Nybegynder
09. maj 2005 - 21:38 #29
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



</script>
Avatar billede busschou Praktikant
09. maj 2005 - 21:39 #30
er fejlen den samme.. stadig i sql ?
Prøv udskrive den
Avatar billede ban_me Nybegynder
09. maj 2005 - 21:45 #31
Jeg er lidt.... dum. Så skær det lige ud i pap for mig!

Altså dvs. at efter min execute skal jeg skrive 'Response.write sql' ?
Avatar billede jokkejensen Novice
10. maj 2005 - 11:43 #32
ja
Avatar billede ban_me Nybegynder
10. maj 2005 - 14:44 #33
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")
Avatar billede ban_me Nybegynder
13. maj 2005 - 16:57 #34
Lukker. Fandt en artikel på active developer der kunne hjælpe mig!

Tak for jeres tid anyway!
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