29. januar 2007 - 10:58Der er
26 kommentarer og 1 løsning
Global.asa spørgsmål
Hejsa
Ja nu har jeg løst artiklen " Filen Global.asa, en asp programmørs ven " som er skrevet af brugeren busschou herinde..
dette er en ganske fin artikel, dog løber jeg ind i lidt problemer, eftersom jeg er en grøn asp programmør, den er skrevet til mdb database...
så i tilfælde af jeg vil have lavet den til mysql hvordan skal den så se ud
<-- global.asa opbygning <script language=VBscript RUNAT=server> Sub Application_OnStart End Sub
Sub Application_OnEnd End Sub
Sub Session_OnStart End Sub
Sub Session_OnEnd End Sub -->
jeg er så hoppet direkte om til den del, som omhandler emnet " Opdater database når brugere kommer online og når de går offline "
hvor en connection til mdb databasen ser sådan her ud
Sub Application_OnStart Application("db") = "DATA Source="&server.mappath("database.mdb")&_ ";Provider=Microsoft.Jet.OLEDB.4.0;" End Sub
hvordan ville denne connection se ud, til en MySQL database???
og jeg skal ind og kontrollere disse felter i databasen...
online, chatonline
online feltet, skal vise om brugeren er online i selve systemet, og dertil bliver der oprettet en session("user_id") når han/hun logger ind... som har brugeren unikke id
chatonline feltet,skal vise om brugeren er online på chatten, hertil bliver der oprettet en session("chaton") som har en variabel på ja/nej
hvordan skulle en global.asa evt. se ud, for dette virker.. og den opdatere feltet online til nej, hvis brugeren lukker browseren....
samt opdatere chatonline til nej, i tilfælde af brugeren lukker chatvinudet
Da vi ikke ved hvilken driver du har, og om du kører localhost, er det ikke til at sige hvilken du skal bruge, men en af de første 4 MyODBC connections burde gøre det.
Sub Application_OnStart Application("db") = Driver={MySQL ODBC 3.51 Driver};Server=localhost;Database=myDataBase;User=myUsername;Password=myPassword;Option=3; End Sub
men hva så omkring det med de sessions... selve asp-scriptet opretter jo de sessions den skal bruge, men kan dette så fungere korrekt!!!
Sub Application_OnStart Application("db") = "Driver={MySQL ODBC 3.51 Driver};Server=localhost;Database=myDataBase;User=myUsername;Password=myPassword;Option=3;" End Sub
korrekt??? men hvordan fungere det med session? fordi jeg har jo allerede oprettet de forskellige sessions, jeg ville have systemet til at arbejde ud fra...
Session bliver helt automatisk kvalt så snart session.timeout er udløbet (normalt mellem 15-20 min). Det er også der Session_OnEnd bliver aktiveret. Der er INGEN måde at lave lave et script, som virker 100%, så session bliver afsluttet når/hvis brugeren lukker browseren.
Jeg er ikke med på hvad du vil gøre når session afsluttes. Du snakker om noget database kontrol (ved oprettelse??), men ellers har du kun session's, og de lukker som sagt automatisk. Det er ikke Application's i stedet??
okay, kan se jeg har udtrygt mig forkert, det beklager jeg...
jeg sidder og arbejder med global.asa, dette er så første gang, jeg overhovedet har kastet mig i krig med dette, og derved er på barbund med de forskellige ting, da jeg kun har den artikel fra busschou at gå efter, men den er jo så skrevet til en mdb database...
men det problem, skulle du så allerede have hjulpet mig med at løse... nu kommer det mere advanceret i selve global.asa nemlig det med sessions
i selve den førnævnte artikel, er der lavet et eksempel omkring sessions, jeg tillader mig at skrive det her
<-- Sub Session_OnStart Session("bruger") = replace(request.form("brugernavn"),"'","") session("kode") = replace(request.form("kode"),"'","")
Dim conn, rs
Set Conn = Server.CreatObject("ADODB.Connection") Conn.Open Application("db") Set rs = Conn.execute("Select * from tabel where bruger = '" &session("bruger") "' &_ "' And kode = '"&session("kode")&"'")
if not rs.eof then session("id") = rs("id") conn.execute("Update tabel set online = true where id = "&session("id")) Else Session.abandon response.redirect "login.html" conn.close set conn = nothing
der opretter den jo selv, en session med id som indhold, men hvad nu hvis jeg allerede har denne fil??? fordi den laver mit asp-script jo, og det må den gerne blive ved med...
kan jeg så bare skrive
Sub Session_OnStart dim conn conn.execute("update tabel set online = "ja" where id = '" & Session("user_id")& "'") Sub Session_OnEnd
jeg er ganske klar over, dette system ikke virker 100 %, men det er bedre end slet ikke noget system overhovedet ;-)
Det kan du desværre ikke. Session_OnStart bliver kun kørt første gang brugeren kommer ind på en ASP side, uden der er nogen session. Læg mærke til at koden redirecter til en html side og session.abandon bliver kaldt. Hvis der var redirected til en ASP side i stedet, havde vi fået et uendeligt loop.
Du skal derimod selv tilføje: conn.execute("update tabel set online='ja' where id="& Session("user_id"))
Til dit nuværende loginscript. Du kan dog godt kalde logaf trickeren: Sub Session_OnEnd if isNumeric(Session("user_id")&"") then Set conn = Server.CreatObject("ADODB.Connection") conn.Open Application("db") conn.execute("update tabel set online='nej' where id="& Session("user_id")) end if End Sub
sorry jeg lyder noobet, men det er jeg også i dette tilfælde... fordi jeg vil også gerne have lavet det sådan, at i tilfælde af session("chaton") den timer ud, at den derved retter det i databasen.....
med denne kommando conn.execute("update tabel set chatonline='nej' where id="& Session("user_id"))
Ja, du kan godt få den til at afslutte (sætte til nej)
Du kan oprette alle de if'er du vil i Session_onEnd. Du kan faktisk skrive alt det ASP kode du vil. Det er en ganske normal Sub(). I stedet for manuelt at kalde den, som man normalt gør med sub/funktioner, gør IIS'en det bare for dig.
Ikke helt med på have du mener med "i tilfælde af session("chaton") den timer ud"?? Session variablerne har ikke selvstændige timeout. Enten er de der alle sammen, eller også er der ingen.
En lille forklaring på session:
Session fungere på den måde, at der oprettes en cookie på brugerens computer med et ID i. Serveren gemmer en tilsvarende fil hvor "sidst-set" også er med. Serveren kører nogle funktioner, som sletter filerne hvis "sidst-set" er over session.timeout tiden.
I denne fil gemmer den også alle de variabler, som er oprette. Jeg skal ikke kunne sige præsis hvordan det ser ud, men noget i denne stil:
Der er derfor heller ikke muligt at nedlægge en enkelt sessionvariabel. Det eneste man kan gøre et at sætte den til tom: session("navn") = ""
Altså, har en bruger været aktiv på sitet (skiftet side), inden for session.timeout tiden, vil ALLE sessionvariabler være tilstede. Hvis ikke, bliver Session_OnEnd funktionen aktiveret af serveren, hvorefter ALLE sessionvariabler bliver nedlagt.
okay, jeg er så bleven misundervist i hvad en session er, for jeg har forstået det sådan en session er noget der bliver gemt i browseren og ikke per txtfil... som en cookie bliver -)
men no om det, jeg ved ikke helt hvordan jeg skal forklare det, for det lader ikke til jeg gør det godt nok...
men sidder sammen med nogle andre og arbejder med et lille cms system... så når det endelig er man logger på systemet, opretter den en session("user_id") som indeholder det unikke bruger_id som passede med de oplysninger brugeren opgav...
derefter når kontrolleren er udfyldt, retter den feltet, online til ja i databasen, så brugeren derved optræder i onlinelisten :-D
men så er jeg bekendt med, folk ikke tager sig tiden, til at trykke på log af knappen, men enten bare surfter videre til en anden side, eller lukker browservinudet, og dertil ville jeg gerne have, den fjerner ham fra onlinelisten igen efter lidt tid, hvilket også er derfor global.asa skulle indeholde <-- if isNumeric(Session("user_id")&"") then Set conn = Server.CreatObject("ADODB.Connection") conn.Open Application("db") conn.execute("update tabel set online='nej' where id="& Session("user_id")) end if -->
fordi så fjerner den selvfølgelig "Ja" i online og erstatter det med et "Nej" men i selve CMS systemet har vi også en chat, hvor det sådan set er det samme, bare den opretter en session("chaton") som lisom online indeholder ja/nej... hvis dette felt er ja, optræder brugeren i onlinelisten på chatten, og hvis nej, jamen så er brugeren der ikke...
så derfor skal funktionen jo også være sådan, i tilfælde af brugeren bare lukker vinduet, at den evt. kan opdatere det felt i databasen, så han ikke optræder der... ved godt der er en ie kommando "beforeunload" tror jeg den lyder... men den virker ikke i mozilla firefox :-(
Der findes flere forskellige script til at hurtigt at logge brugere af, men som du selv har opdaget er de ikke cross-browser, og heller ikke særlig virksomme.
Jeg kan lige så godt sige det. Der findes ingen gylden løsning.
Det jeg selv har gjort, er at have en skjult iFrame, som opdatere hver 30 sek. Den opdatere så hele tiden databasen med et tidspunkt for "sidst set online". Hvis den tid er over 30 sek siden, er brugeren "Ikke online".
Angående session, så prøv at deaktivere cookies. Så vil du se at du ikke kan logge ind længere. Man kan så godt vælge at opfatte cookies, som en del af browseren. Med det nye "tabbed-browsing", som er kommet frem, skal jeg ikke kunne sige om sessioncookies er blevet flyttet ind i kildekoden i stedet.
Mener at kan huske at man i nogle browsers har mulighed for at kun aktivere sessioncookies.
Men husk på at sessionvariablerne kun ligger på serveren, det eneste som ligger på klienten er sessionID'et. Jeg kunne dog forstille mig at webserveren (IIS/Apache) så småt er ved at gå over i noget database styring i stedet for filstyring.
[online.asp] <!--#include file="start.asp"--> <% if isnumeric(session("userID")) then conn.execute("update userTable set lastOnline=now() where id="& session("userID")) end if %> <script> window.setTimeout("location.reload()",30000) </script>
okay, hvis jeg vil lave det i min connection til databasen....
set rs = conn.execute("select * from bruger where chatonline = ja")
er det muligt, man kunne lave det sådan den også kiggede feltet chattime igennem, og hvis den var mere end 7 minutter gammel, er brugeren ikke online længere...
Du behøver ikke et hidden felt. Du indsætter bare klokken via databasen's indbyggede funktion: conn.execute("update bruger set chattime=now() where id = '" & session("user_id") & "'")
Og ja du kan godt bruge AND. Præsis som du har gjort, men der skal nok lige ' omkring ja: set rs = conn.execute("select * from bruger where chatonline = 'ja' AND chattime>DATE_ADD(now(), INTERVAL -7 MINUTE)")
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.