webForumDet fria alternativet

Online-script

35 svar · 1 073 visningar · startad av magnusfernstrom

magnusfernstromMedlem sedan mars 20032 184 inlägg
#1

Till att börja med; jag vet att frågan tagits upp tidigare, och jag har läst alla trådar jag fick upp när jag sökte om ämnet. Dock är jag fortfarande lite osäker på hur jag skall göra.

Det är nämligen så att jag vill ha en funktion som gör det möjligt att se om en användare är inloggad eller inte. 0 i databasen är offline och 1 är online. Att sätta värdet är inga problem. Men när man stänger sidan är ju fortfarande värdet 1.

Jag har läst om detta med global.asa och Session on end och allt vad det heter, men jag förstår ändå inte riktigt.

Kan man läggaa in en databas-koppling i global.asa och sätta värdet där? Hur skall koden se ut?

Har ingen erfarenhet inom global.asa. Mycket tacksam för svar.

/M

Erik JuhlinMedlem sedan maj 20007 625 inlägg
#2

Du kan använda dig av Session_OnEnd i global.asa. Problemet är bara att den inte funkar perfekt.

Så smartare är nog att i användartabellen lagra ett datum varje gång de visar en sida. Och sen när du visar resultatet så räknar du ihop de som visat en sida de senaste tio minutrarna. :)

magnusfernstromMedlem sedan mars 20032 184 inlägg
#3

Hmm, jag förstår inte riktigt. Kan du förklara lite mer ingående. Alltså, för det första. Vad är det som inte fungerar så bra med global.asa?

Och fungarer det att användaren visas som offline direkt när man kör på databas?

Erik JuhlinMedlem sedan maj 20007 625 inlägg
#4

Session_OnEnd ska köras när användarens session dör. Dock är det inte säkert att den gör det. Därför är det inte bra att förlita sig på enbart den.

Vad menar du med det andra? Så som jag skriver så dröjer det ju då 10 minuter innan den visas som utloggad. Kan ju också sänka det till 5 minuter. Plus att man lämpligen sätter den som utloggad direkt när personen klickar på logga ut.

För det är väl ett system där man loggar in..?

magnusfernstromMedlem sedan mars 20032 184 inlägg
#5

Yes box! Ett litet community om man nu vill kalla det för det. Men om man sänker den till 5 minuter, betyder det då att man automatiskt loggas ut efter det också?

(Jag är helt ute, jag vet :))

Erik JuhlinMedlem sedan maj 20007 625 inlägg
#6

Nej, men det är däremot lämpligt att använda samma siffra som Session-timeout. Då stämmer liksom resultatet mer överens med verkligheten. :)

magnusfernstromMedlem sedan mars 20032 184 inlägg
#7

Hmm, jag kanske skall testa Session?
Hur skall man gå tillväga då?

MickeA.comMedlem sedan feb. 20034 528 inlägg
#8

När man loggar in:

Session("din_session") = "UsrID"
Session.TimeOut = 5 'Minuter

Antar att varje användare har ett ID i databasen, det kan vara smart att ha det ID't som värde i sessionen, för då kan man hela tiden, på alla sidor mm. lätt ta reda på vilken användare som gör vad osv.

För att döda sessionen använder du:

Session.Abandon

Bara ett tips :)

magnusfernstromMedlem sedan mars 20032 184 inlägg
#9

Tack!

Men hur skall jag gå tillväga om jag vill ändra ID-numret utrifrån global.asa? Jag vill ju visa dom som utloggade även när dom inte tryck på logga ut, utan kanske har stängt fönstret eller surfat vidare.

MeleaMedlem sedan juli 20032 667 inlägg
#10

Kanske såhär?

SQL = "SELECT * FROM members"
Set objRS = Conn.Execute(SQL)

Do Until objRS.EOF

If RecSet("status") = 1 AND  DateDiff("n", objRS("activetime"), Now) > 35 Then
	'Kör koden
End If

objRS.Movenext
Loop

35 är samma som 35 minuter, alltså, om besökaren varit inaktiv i mer än 35 minuter så loggas han automatiskt ut.
Du måste dock uppdatera fältet activetime varje gång sidan laddas för den specifika användaren för att det ska funka.

magnusfernstromMedlem sedan mars 20032 184 inlägg
#11

Tackar tackar, skall pröva.

magnusfernstromMedlem sedan mars 20032 184 inlägg
#12

Nu är det så här; jag kör en kod som sätter ett datum samt värdet 1 när man loggar in. Sedan kollar jag i forumet vid varje loop av en tråd om den som skrivit den är inloggad. Det räcker väl att kolla det med en vanlig IF-sats va?

Men den kod jag fick av dig förstår jag inte rikigt. Där det står att jag skall köra koden - vad är det för kod som skall köras? Den som kollar om användaren är inloggad?

magnusfernstromMedlem sedan mars 20032 184 inlägg
#13

Snälla, jag vet att någon vet svaret. Måste verkligen ha svar.

/Magnus

magnusfernstromMedlem sedan mars 20032 184 inlägg
#14

Det är inte annat än att man blir lite ledsen i ögat när ingen svarar i min tråd :(

voigtann1Medlem sedan juni 20018 810 inlägg
#15

red. glöm det jag skrev...

magnusfernstromMedlem sedan mars 20032 184 inlägg
#16

Ursäkta för mitt beteende, men jag måste fråga; varför i allsin dar säger ingen hur jag bara skall göra med den förbaskade koden?

Jag behöver verkligen hjälp nu. Det är bråttom.

M.CheraghiMedlem sedan juli 20013 362 inlägg
#17

För det första.
Du ger inte allt för mycket information angående hur din databas ser ut osv osv.
Då känner man sig inte motiverad till att hjälpa. men jag ska förklara med text hur du ska gå till väga.

1. Du behöver två tabeller i databasen.
1.2 "Tid" och "Status"

När en användare loggar in sätter du Tid till "now()" och status till exempelvis "online"
Sedan har du ett externt dokument som du döper till exempelvis "keepalive.asp" som du includar i varje dokument t.ex gastbok.asp, mess.asp chat.asp

Skriv exempelvis så här i varje dokument.

<!-- #include file="keepalive.asp" -->

I keepalive.asp så uppdaterar du tabellen "tid" med "now()"
så att det uppdateras, dvs att du är aktiv på hemsidan och skall inte bli utloggad. Samtidigt i Keppalive.asp har du en kod som kollar av dom som har varit inaktiva i mer är5/10/15/20 minuter och sätter dom som offline. exempelvis med denna kodsnutt

Do Until RecSet.eof
If RecSet("status") = online AND  DateDiff("n", objRS("tid"), Now) > 10 Then

*kod för att uppdatera databasen och sätta personen i fråga som offline*

RecSet.movenext
loop

då har du loopat igenom hela databsen efter folk som står som online med Tid som inte är tillräckligt uppdaterad, och sätter dom som offline.

Så på din onlinelista syns dom som offline.
Nu är det så att detta kanske blir lite påfrestande för databasen om du ska ha 25-40 tusen användare online samtidigt som playahead/lunarstorm. men kommer du ha kanske en 100-200 pers så är det relativt lugnt.

Restrerande kod för du skriva själv, här i forumet hjälper vi dig om du har problem med en kod, eller vill veta tillvägagångssätt.
vi skriver inte koden rakt uppochner. För vi vet inte hur din databas ser ut, hur resten utan ASP koden ser ut, hur du skriver dina RecSet, dina connections till databasen osv osv.
Samt att folk kanske inte har så mycket tid till att skriva allt, då dom kanske är på jobbet? Eller på semester. Eller ja. vad som helst

Mvh

magnusfernstromMedlem sedan mars 20032 184 inlägg
#18

Ah, tack M.Cheragi. Jag ber som sagt för ursäkt för mitt aningen dåliga uppförande då jag skrev 4 inlägg i rad. Jag krävde dock inte att få koden skriven. Jag ville bara ha en förklaring för hur jag skulle skriva koden. Eller snarare, vart. Som du skrev - tillvägagångssätt. Det var just det jag var ute efter.

Jag ber att få tacka dig M.Cheragi.

/M

magnusfernstromMedlem sedan mars 20032 184 inlägg
#19
Set db = Server.CreateObject("ADODB.Connection")
db.Open "Driver={Microsoft Access Driver (*.mdb)}; DBQ=" & server.mappath("db.mdb")
SQL = "SELECT * FROM users WHERE username = '" & Session("userName") & "'"
Do Until rs.EOF
If rs("status") = 1 AND  DateDiff("n", rs("tid"), Now) > 12 Then

*kod för att uppdatera databasen och sätta personen i fråga som offline*

RecSet.movenext
loop

Nu har jag kommit såhär långt ;)

Alltså, hur skall jag skriva för att uppdater då?

Måste jag skriva en ny SQL-sats då?
Går det med två SQL-satser inom samma databas-koppling?

M.CheraghiMedlem sedan juli 20013 362 inlägg
#20
'Öppna databasen
Set db = Server.CreateObject("ADODB.Connection")
db.Open "Driver={Microsoft Access Driver (*.mdb)}; DBQ=" & server.mappath("db.mdb")

'ta ut alla som är markerade som online
SQL = "SELECT * FROM users WHERE status = "1""
set rs = db.execute(SQL)

'Starta en loop
Do Until rs.EOF

'kolla ifall nån som är online samt har gammal tid med IF-sats
If rs("status") = 1 AND  DateDiff("n", rs("tid"), Now) > 12 Then

'Ifall det hittades någon, uppdatera honom till offline
SQL="UPDATE users SET status = "2""
db.execute(SQL)

'Stänga av IF-satsen
end if

'Hoppa vidare till nästa person, osen loopa
RecSet.movenext
loop

'slutligen stänga dina recordset samt databaskopplingen
RS.close
Set RS = nothing
DB.close
Set DB = nothing

Nu var det gaalet länge sen jag knåpade ASP samt att jag sitter på jobbet och är lite stressad och kan inte tänka klart!
Jag har ändrat en del i din SQL fråga. och lagt till update.

edit: jag vet inte ifall din tabell "status" är formatet TAL eller TEXT
men jag antog att du har TEXT, så jag använde " dubbel för dina värden, du får testa dig fram.. eller söka i formuet, vad som skall vara till vad. jag komemr inte ihåg

Genererad på 391 ms · cache AV · v20260730165559-full.f96bc7eb