I din log ind side hvor personen logger ind sætter du en session ved følgende: Session("start") = Now I din log ud side hvor personen logger ud finder du tidsforskellen ved Moenter = DateDiff("n", Now, Session("start")) Så må du derudover jo gemme mønterne i en database?
<b><br> <% If Request.QueryString("admin") = "tjek" then navn = trim(replace(Request.Form("brugernavn"), "'", "")) kode = trim(replace(Request.Form("kode"), "'", "")) Set Conn = Server.CreateObject("ADODB.Connection") Conn.Open "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath ("../db/System.mdb") sql = "SELECT * from admin WHERE brugernavn = '" & navn & "' AND kode = '" & kode & "'" Set rs = Conn.Execute(sql) if not rs.eof then
Set gw = Server.CreateObject("ADODB.RecordSet") MySQL = "Select * From admin WHERE ID = " & rs("ID") gw.Open MySQL, Conn, 1, 3 gw.Update gw("ip") = Request.ServerVariables("REMOTE_ADDR") gw.Update
Session("brugeradgang") = "1" Session("brugernavn") = rs("brugernavn") Session("id") = rs("id") Session("status") = rs("status") Session("IP") = Request.ServerVariables("REMOTE_ADDR") Response.Redirect "../Plus/Menu.asp" else response.redirect "../Plus/Fejl.asp" end if end if Set conn = Nothing Set rs = Nothing %> </b>
Jeg vil anbefale at man ikke opdatere database hver minut, hvis det er det du har tænkt dig. Jeg ville umiddelbart gemme dato og klokken for hvornår brugeren har oprettet sin profil, samt en oversigt over hvor han har brugt mønter (i databasen). Så ville jeg udregne det hele når der var brug for det.
Først udregningen for hvor mange mønter han har totalt, ved at hente datoen fra hans profil og finde antal minutter fra dengang til nu ved hjælp af datediff. Herefter ville jeg hente hans total brug fra databasen ved hjælp af SQL. For eksempel.
Hmm, jeg mistforstod vist noget, der skal kun tjenes en mønt per minut, så længe man er online?
Så skal du lave det hele i global.asa, når brugere kommer ind på siden starter du en session som af busschou, og når sessionen dør tæller du op hvor mange mønter man har tjænt og gemmer det i databasen.
tænke tænke... Der er et timeout på 20 minutter på sessioner, så spørgsmålet er om du vil tage den fra sidste gang brugeren kaldte en side, eller når hans session døde.
Jeg har prøvet at lave et lille eksempel: Lave en fil ved navn moent.asp og udfyld følgende: <% Session("moent_total") = DateDiff("n", Session("moent_start"), Now())
Response.Write "Du har nu " & Session("moent_total") & " mønt(er)." %>
Lav en fil med navnet global.asa, og udfyld med følgende: <OBJECT RUNAT=Server SCOPE=Session ID=MyInfo PROGID="MSWC.MyInfo"> </OBJECT> <script language=VBScript RUNAT=Server>
sub Session_OnStart Session("moent_start") = Now() End Sub
Sub Session_OnEnd strSQL = "UPDATE brugerprofil SET moenter = " & Session("moent_total") & " WHERE ID = " & Session("brugerID") End Sub </script>
Så kan du under sub Session_OnEnd indsætte de optjænte mønter i brugerens profil, jeg har prøvet at lave en lille SQL streng for at vise hvordan det kunne se ud.
Jep den skal først starte når man er logget ind hvilket hvis også er nævnt nogle sider oppe :) Og hvordan skal det se ud når man trækker det ud i Profil.asp hvis den skal opdatere hvergang men får en mønt?
Og hvad skulle jeg gøre med:
If Session("brugeradgang") = "1" Then Session("moent_total") = DateDiff("n", Session("moent_start"), Now())
Og skal Session("moent_start") = Now() erstattes med noget i global.asa?
Hvis du har en database med brugerprofiler, skal du oprette en colonne til total mønter, det skal nok være en int.
Hvis du laver en include fil med: If Session("brugeradgang") = "1" Then Session("moent_total") = DateDiff("n", Session("moent_start"), Now())
Denne fil skal du så includere på alle sider (som tæller mønter).
global.asa kommer til at se sådan her ud: <OBJECT RUNAT=Server SCOPE=Session ID=MyInfo PROGID="MSWC.MyInfo"> </OBJECT> <script language=VBScript RUNAT=Server>
Sub Session_OnEnd strSQL = "UPDATE brugerprofil SET moenter = " & Session("moent_total") & " WHERE ID = " & Session("brugerID") End Sub </script>
Og du skal opdatere strSQL med følgende: brugerprofil skal skiftes ud med tabelnavnet. moenter skal skiftes ud med colonnen med total mønter. ID skal skiftes ud med primary key indexet.
Jeg ville lave en fil ved navn moent.inc og udfylde følgende: <% If Session("brugeradgang") = "1" Then Session("moent_total") = DateDiff("n", Session("moent_start"), Now()) %>
Hmm.. Det funker hvis ikke helt kan vi lige samle det for at lige tjekke om det er mig der har gjort en fejl :s Prøv og nævn de forskellige filnavne også indholdet.
Bortset fra den ikke viser det i Profil.asp og at den genstarter ens mønter hver gang men logger på og den skriver "Du har nu X mønt(er)" på alle de sider den skal tælle så virker det da fint ;) Vil du ikke være sød og hjælpe med at rette de sidste "fejl"? :)
Logud.asp skal se sådan her ud i stedet. <% Set Conn = Server.CreateObject("ADODB.Connection") Conn.Open "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath ("../db/System.mdb") SQL = "UPDATE admin SET [total moent] = [total moent] + " & Session("moent_total") & " WHERE ID = " & Session("ID") Conn.execute(SQL) Conn.Close Conn = Nothing
' slet værdierne i alle sessions Session.Abandon ' og videresend brugeren Response.Redirect "Login.asp" %>
Du kan tilføje dette i listen over informationer i profil.asp
Logud.asp skal se sådan her ud i stedet. <% Set Conn = Server.CreateObject("ADODB.Connection") Conn.Open "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath ("../db/System.mdb") SQL = "UPDATE admin SET [total moent] = [total moent] + " & Session("moent_total") & " WHERE ID = " & Session("ID") Conn.execute(SQL) Conn = Nothing
' slet værdierne i alle sessions Session.Abandon ' og videresend brugeren Response.Redirect "Login.asp" %>
I profil.asp skal du skrive: <%=rs("Total moent") %>
Nej. Eller jo når man lige har oprettet en bruger står der 0 men så når man begynder at få mønter så er det bare tomt. Prøv og tjek www.hjemmeskoen.dk også en profil.
Ja okay det min fejl det virker fint men det virker så åbenbart ikke lige på en af mine brugere. Nå men kan du så lige fortælle hvad jeg skal sætte ind for at den opdatere hver gang man får en mønt? Så man er fri for at logge ud og ind hele tiden :)
Umiddelbart ville jeg ikke opdatere en access database hver minut, det er simpelhen ikke hensigtsmæssigt og du vil højest sandsynligt begynde at opleve stabilitets problemer.
Hvis brugere gerne vil vide hvor mange mønter de selv har i alt, så kan du lave et tjek og vise dem den samlede udregning, for eksempel sådan her:
<tr> <td height="24" width="94"><b>Mønter:</b></td><td height="24" width="446"><% If session("brugernavn") = rs("brugernavn") Then Response.write CInt(rs("Total moent") + Session("moent_total")) Else Response.write CInt(rs("Total moent")) End If %></td></td> </tr>
Hmm.. Er du en milliard procent sikker på der ikke er andre muligheder? Jeg mener bare dengang der stod det der "Du har nu X antal mønt(er)" der opdaterede den jo hvergang man tjente en mønt. Gjorde den det på den måde som nævnt oven over eller?
If session("brugernavn") = rs("brugernavn") Then Response.write CInt(rs("Total moent") + Session("moent_total")) Else Response.write CInt(rs("Total moent")) End If
Altså sådan det fungere er at alle informationerne ligger i sessionerne, det vil sige at man kan hente værdien ud fra sessionerne og se resultatet med det samme (uden at opdatere databasen), problemet med sessions er at man kun kan se informationerne for en selv (altså ens egen session) og ikke andre brugere på hjemmesiden.
I dette eksempel tager jeg lidt fra databasen og lidt fra sessionen til at udregne det totalt antal mønter man har:
If session("brugernavn") = rs("brugernavn") Then Response.write CInt(rs("Total moent") + Session("moent_total")) Else Response.write CInt(rs("Total moent")) End If
Den udregner dog kun det totale antal mønter hvis du kigger på profilen for din egen bruger (netop fordi du ikke har sessions værdierne for andre brugere).
Du spørger om der ikke er andre måder. Jo det er der da, men det ville blive mere besværligt, for der skulle vi lege med globale variabler som Application og dictonary variablerne. Spørgsmålet er, hvor langt er du villig til at gå (Vil anbefale at du læser videre på det, så du kan danne en forståelse af hvordan kan virke).
Jep forstår det godt. Andre kan ikke se ens egen session. Men ville det være svært og udbygge med nogle af de ting som du foreslår? Altså "globale variabler som Application og dictonary variablerne"
Applications ville nok være nemmest at bruge, da det mindre mest om session variablerne. Men jeg vil anbefale at du prøver at læse lidt videre på det. :)
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.