16. juni 2005 - 13:57Der er
34 kommentarer og 1 løsning
Hjælp til at ligge værdien ét til en værdi i en DB med ASP
Hej.
jeg kan ikke helt finde ud af at få det her til at virke. Som titlen antyder vil jeg hive en talværdi ud af en database, og tillægge den værdien 1, ved en bestemt handling. her er hvad jeg har:
' Authes user, password, and fixed a known securitybug to many login systems. strUsername = Trim(Replace(request("email"),"'","''" )) strPassword = Trim(Replace(request("password"),"'","''" ))
Sql = "Select Count(*) as Found from users where (email = '" & strUsername & "') and (password ='" & strPassword & "') and (logins < 10)" Set LO = RS.Execute(Sql) if LO("Found") = 0 then Session("login") = "" error = "Du har ikke adgang til materialet. Tjek dit brugernavn og password og prøv igen." else strDSN = "DRIVER={Microsoft Access Driver (*.mdb)};DBQ=" & Server.MapPath("usersystem.mdb") Set myConn = Server.CreateObject("ADODB.Connection") myConn.Open strDSN strSQL = "SELECT * FROM users where (email = '" & Request("email") & "') and (password ='" & Request("password") & "')"
'skal ligge 1 til antallet af logins // Set rs2 = Server.CreateObject("ADODB.Recordset") strSQL2 = "select * from Users where logins <> " & request.querystring("0") rs2("logins") = rs2("logins") + 1 rs2.update // Set ez = myConn.Execute(strSQL) Session("login") = "Authed" Response.Redirect "default.asp" EZ.Close RS.Close Conn.Close End if End if %>
det er koden imellem de to // // den er gal med. jeg har prøvet alt muligt, men har ikke funet en løsning.
det virker dog ikke. jeg får en fejl der siger: ADODB.Recorset (0x800A=cc1) elementet kan ikke findes i den samling, der svarer til det anmodede navn eller ordenstal
Du åbner ikke dit recordset... Desuden ser det ut til at kunne gøres meget nemmere. Det ser ud til at du bare vil tælle hvor mange gange personen har logget ind:
if LO("Found") = 0 then Session("login") = "" error = "Du har ikke adgang til materialet. Tjek dit brugernavn og password og prøv igen." else 'skal ligge 1 til antallet af logins rs.execute("update users set logins=logins+1 where (email = '" & strUsername & "') and (password ='" & strPassword & "')") Session("login") = "Authed" Response.Redirect "default.asp" RS.Close Conn.Close End if
Jeg synes desuden at du roder lidt rundt i din navngivning af variabler (ikke at de er forkerte), men det er smartere at kalde dit recordset RS og din connection Conn :o)
Også er "error" en del af ASP sproget, så det navn skal du nok holde dig fra, og redirect afbryder vidre handling, så du får ikke lukket din conection og recordset.
Her er koden som jeg ville skrive den: <% SET conn = Server.CreateObject("ADODB.Connection") conn.Open "Driver={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath("usersystem.mdb")
If Request("mode") = "Check" then ' Authes user, password, and fixed a known securitybug to many login systems. strUsername = Trim(Replace(request("email"),"'","''" )) strPassword = Trim(Replace(request("password"),"'","''" )) Sql = "Select id from users where (email = '" & strUsername & "') and (password ='" & strPassword & "') and (logins < 10)" Set rs = conn.Execute(Sql) if rs.eof then Session("login") = "" errorCode = "Du har ikke adgang til materialet. Tjek dit brugernavn og password og prøv igen." else 'skal ligge 1 til antallet af logins rs.execute("update users set logins=logins+1 where id="& rs("id")) Session("login") = "Authed" on error resume next RS.Close Conn.Close on error goto 0 Response.Redirect "default.asp" End if End if
on error resume next RS.Close Conn.Close on error goto 0 %>
men vil lige høre til det du kode du har skrevet, når du skriver "on error resume next", hvad er det så lige den gør? og kan jeg i "on error goto ()" skrive en sti til en side jeg selv laver der fortæller der er en fejl?
Det var min fejl: rs.execute("update users set logins=logins+1 where id="& rs("id"))
skal være: conn.execute("update users set logins=logins+1 where id="& rs("id"))
Med "on error resume next" sætter man ASP's fejlhåndtering i gang, hvilket betyder at den ikke stopper koden ved fejl. "on error goto 0" sætter fejlhåndteringen tilbage til default. Mig bekendt kan du ikke bruge det på andre måden end disse to. Jeg har sat det omkring fordi recordset objektet ikke altid er åben, selv om man bruger det, og man får derfor en fejl når man vil lukke det. Det har noget at gøre med om der er resultater eller ej i recordsettet (har ikke helt fundet ud af det..)
Der er knyttet et err objekt til error. I dette err objekt, bliver den seneste fejl gemt, og med det, kan du lave det, der svarer til en try/catch. Det kunne f.eks bruges til database connectionen, så man kan vise en brugervenlig fejl beskrivelse:
on error resume next SET conn = Server.CreateObject("ADODB.Connection") conn.Open "Driver={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath("usersystem.mdb") if err.number <> 0 then response.write "Der kunne ikke laves en forbindelse til databasen. Kontakt administrator." end if on error goto 0
En ide til at gøre din kode lidt nemmere. Du skal jo kun lukke forbindelsen når du redirecter og i bunden af siden. Du kan derfor smide din redirect i en funktion, som du smider i en include-fil, sammen med de andre funktioner du ofte bruger:
function myRedirect(RDurl) on error resume next RS.Close Conn.Close on error goto 0 Response.Redirect RDurl end function ... if rs("betalt") = "nej" then call myRedirect("betaling.asp") else ...
Det gør ikke det helt store, hvis du ikke får lukket alle recordsets, hvis du får gang i flere på en gang. Du kan stadig lukke de ekstra selv før myRedirect(). Det vigtigste er at begrænse antallet af åbne forbindelser.
jeg tror ikke jeg skal gøre det mere besværligt for mig selv med funktioner osv. men ja, jeg mener nu også at jeg får lukket alle forbindelserne, eller hvad?? smider hele koden så kan du se.
<% SET conn = Server.CreateObject("ADODB.Connection") conn.Open "Driver={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath("usersystem.mdb") if err.number <> 0 then response.write "Der kunne ikke laves en forbindelse til databasen. Kontakt administrator." end if on error goto 0
If Request("mode") = "Check" then ' Authes user, password, and fixed a known securitybug to many login systems. strUsername = Trim(Replace(request("email"),"'","''" )) strPassword = Trim(Replace(request("password"),"'","''" )) Sql = "Select * from users where (email = '" & strUsername & "') and (password ='" & strPassword & "') and (logins < 10)" Set rs = conn.Execute(Sql) if rs.eof then Session("login") = "" errorCode = "Du har ikke adgang til materialet. Tjek dit brugernavn og password og prøv igen." else Session("login") = rs("ID")
'Tjekker om brugeren har betalt, eller sendes brugeren til betalingssiden if rs("betalt") <> "ja" then on error resume next RS.Close Conn.Close on error goto 0 Response.Redirect "betaling.asp" else
'skal ligge 1 til antallet af logins Conn.execute("update users set logins=logins+1 where id="& rs("id")) on error resume next RS.Close Conn.Close on error goto 0 Response.Redirect "default.asp" End if End if End if
on error resume next RS.Close Conn.Close on error goto 0 %>
Hvis man vil ha ASP til at gennerer HMTL kode ved f.eks en errorCode. hvad skriver jeg så??
her er det jeg gerne vil ha den til at skrive:
erroCode = <p><font face="verdana" size="2">Du har ikke adgang til materialet. Tjek dit brugernavn og password og prøv igen.</font></p><p><font face="verdana" size="2">Er du ikke oprette som bruger kan du gøre det <a href="opret.asp">her.</a></font> </p>
Sql = "Select * from users where (ID = Clng(idet))" Set rs = conn.Execute(Sql)
men jeg får en fejl der siger, der er for få parametre. der var ventet 1. det er linien "Set rs = conn.Execute(Sql)" den siger fejlen opstår. Kan du hjælpe fennec??
eller skal jeg lave et nyt indlæg, med mulighed for points??
Undskyld jeg ikke svarede før, men pga E's email problemer, er det blevet meget besværlig at følge med i alle de ? jeg deltager i, så nogle bliver "glemt". Jeg kan se du har stillet det som nyt ? og har fået svar.
jeg har fået svar på eller selv fundet ud af de ting jeg er stødt på. dog mangle rjeg stdig lige at finde ud af hvad du mner med at jeg mangler en "on error resume next" allerført.
on error resume next '<-- Denne mangler du. SET conn = Server.CreateObject("ADODB.Connection") conn.Open "Driver={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath("usersystem.mdb") if err.number <> 0 then response.write "Der kunne ikke laves en forbindelse til databasen. Kontakt administrator." end if on error goto 0
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.