Avatar billede hingebjerg Nybegynder
16. juni 2005 - 13:57 Der 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:

<%
SET RS = Server.CreateObject("ADODB.Connection")
rs.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 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.
Avatar billede nythjem Nybegynder
16. juni 2005 - 14:00 #1
:)

Hvis logins er af typen tekst i databasen, så skal du have lavet dit udtræk om, så det opfattes, at der er tale om et tal..

Gør sådan..

rs2("logins") = CInt(rs2("logins")) + 1
Avatar billede nythjem Nybegynder
16. juni 2005 - 14:02 #2
Anbefaling:

CInt går kun fra -32000 til 32000..

Så i stedet må jeg nok anbefale, at du bruger CLng.

Så kommer det til at se sådan ud i stedet..

rs2("logins") = CLng(rs2("logins")) + 1
Avatar billede hingebjerg Nybegynder
16. juni 2005 - 14:06 #3
logins er af typen tal i databasen.
Avatar billede nythjem Nybegynder
16. juni 2005 - 14:10 #4
Okay, så er det en kende underligt, at den ikke bare ligger tallet til..

Men har du prøvet med ovenstående forslag?
Avatar billede hingebjerg Nybegynder
16. juni 2005 - 14:12 #5
ikke nået det endnu. Men mangler der ikke noget forbindelse til strSQL2??
Avatar billede hingebjerg Nybegynder
16. juni 2005 - 14:15 #6
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
Avatar billede nythjem Nybegynder
16. juni 2005 - 14:16 #7
Jo da, men nu skal du jo også kun udskifte:

rs2("logins") = rs2("logins") + 1

Med:

rs2("logins") = CLng(rs2("logins")) + 1

Response.Write ":)"
Avatar billede hingebjerg Nybegynder
16. juni 2005 - 14:18 #8
jep, det har jeg også gjort.
Avatar billede hingebjerg Nybegynder
16. juni 2005 - 14:19 #9
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") & "') and (logins>0)"
   
   
   
    'ligger 1 til antallet af logins
                                                                               
                                    Set rs2 = Server.CreateObject("ADODB.Recordset")
                                    strSQL2 = "select * from Users where logins <> " & request.querystring("0")
                                    rs2("logins") = CLng(rs2("logins")) + 1
                                    rs2.update

er hvad jeg har nu
Avatar billede nythjem Nybegynder
16. juni 2005 - 14:25 #10
Super, og den opdaterer ikke posten, eller hvad?
Avatar billede fennec Nybegynder
16. juni 2005 - 14:26 #11
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
Avatar billede hingebjerg Nybegynder
16. juni 2005 - 14:26 #12
nej......
Avatar billede hingebjerg Nybegynder
16. juni 2005 - 14:27 #13
nej, var til den tråd før den her oppe. tester lige det der.
Avatar billede hingebjerg Nybegynder
16. juni 2005 - 14:32 #14
tak for svarene. Jeg kan konkludere at fennec's svar virkede
Avatar billede fennec Nybegynder
16. juni 2005 - 14:37 #15
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
%>

Så håber jeg ikke at jeg har lavet fejl deri :o)

.o) <-- One Eyed Jack
Avatar billede hingebjerg Nybegynder
16. juni 2005 - 14:50 #16
Tusinde tak for hjælpen fennec. Dig får jeg vist brug for noget mere ;)

Håber du vil være behjælpelig når jeg får nogle probs.

for som du nok kan se, er jeg ikke hardcore til det her asp.
Avatar billede fennec Nybegynder
16. juni 2005 - 15:00 #17
Jeg er (næsten) altid klar til at hjælpe. Jeg skal jo sove på et tidspunkt :o)
Avatar billede hingebjerg Nybegynder
16. juni 2005 - 17:31 #18
det skal du så ikke regne med her det næste stykke tid :P
Avatar billede hingebjerg Nybegynder
16. juni 2005 - 17:35 #19
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?
Avatar billede hingebjerg Nybegynder
16. juni 2005 - 18:51 #20
og nu kan jeg sq ikke få dit kode til at virke. Jeg fatte rik det her ..... :(
Avatar billede hingebjerg Nybegynder
16. juni 2005 - 18:53 #21
den siger at rs. Execute ikke understøttes af objektet
Avatar billede fennec Nybegynder
17. juni 2005 - 08:32 #22
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
Avatar billede hingebjerg Nybegynder
17. juni 2005 - 10:39 #23
kanon, så virker dit kode også.

Nu vil jeg gerne tjekke om folk har betalt, så jeg har lavet følgende if sætning:

    if rs("betalt") = "nej" then
            on error resume next
              RS.Close
              Conn.Close
            on error goto 0
            Response.Redirect "betaling.asp"
        else

men det er somom den ikke læser "nej" i DBen.....

Hvad gør jeg forkert med de strings jeg henter ud fra DBen??
Avatar billede hingebjerg Nybegynder
17. juni 2005 - 10:41 #24
og min sql har jeg sat til: select * from users .............
Avatar billede hingebjerg Nybegynder
17. juni 2005 - 10:54 #25
Har selv fået det til at virke nu.
Avatar billede fennec Nybegynder
17. juni 2005 - 11:22 #26
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.
Avatar billede hingebjerg Nybegynder
17. juni 2005 - 11:31 #27
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
%>
Avatar billede fennec Nybegynder
17. juni 2005 - 12:33 #28
Der mangler en "on error resume next" allerførst, men ellers ser det fint ud :o)
Avatar billede hingebjerg Nybegynder
17. juni 2005 - 13:33 #29
i linien under conn.Open eller linien under if err.number??
Avatar billede hingebjerg Nybegynder
17. juni 2005 - 13:48 #30
og et lille nyt spørgsmål.

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&oslash;v igen.</font></p><p><font face="verdana" size="2">Er du ikke oprette som bruger kan du g&oslash;re det <a href="opret.asp">her.</a></font> </p>
Avatar billede hingebjerg Nybegynder
17. juni 2005 - 14:48 #31
bare glem den kommentar lige her over.
Avatar billede hingebjerg Nybegynder
17. juni 2005 - 15:13 #32
Nyt problem: jeg har lagt ID'et fra databasen i session("login") og vil nu finde brugeren frem på en ny side. hr er hvad jeg gør:

idet = session("login")

SET conn = Server.CreateObject("ADODB.Connection")
conn.Open "Driver={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath("usersystem.mdb")

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??
Avatar billede fennec Nybegynder
20. juni 2005 - 13:31 #33
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.
Avatar billede hingebjerg Nybegynder
20. juni 2005 - 15:58 #34
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.

er det HELT i toppen af koden eller hvad?
Avatar billede fennec Nybegynder
20. juni 2005 - 16:13 #35
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
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