Avatar billede frida Nybegynder
18. april 2006 - 18:32 Der er 15 kommentarer og
1 løsning

Problemer med login

Jeg får denne fejlmeddelelse, når jeg opretter mig som ny bruger med email, password
og navn:


Microsoft OLE DB Provider for ODBC Drivers error '80004005'

Query-based update failed because the row to update could not be found.


usermanager.asp, line 678


Oplysningerne kommer korrekt i databasen (mySQL), jeg viderestilles ikke til ../indkoebsvogn/bestilling.asp, men får istedet fejlen.
Hvis jeg herefter går tilbage og logger mig ind som den bruger, jeg lige oprettede - (den der gav mig fejl) - fungerer det fint.


Koden ser sådan her ud:



<%
dim strEmail, strPassword, strAction, strPage

strPage = request("page")
if strPage = "" then strPage = "../indkoebsvogn/bestilling.asp"


strEmail = Request.Form("email")
strPassword = Request.Form("password")
strAction = Request.Form("action")

Select Case strAction
  case "login"
    if CheckUser(strEmail, strPassword) then
      Session("userok") = "yes"
      response.redirect strPage
    else
      Session("userok") = ""
      ShowLoginForm strEmail
      ShowCreateForm strEmail
    end if
  case "create"
    ShowCreateForm ""
  case "write"
    WriteNewUser
    if CheckUser(strEmail, strPassword) then
      Session("userok") = "yes"
      response.redirect strPage
    else
      Session("userok") = ""
      Response.write "<h1>Brugeroprettelse fejlede!</h1>"
      ShowCreateForm ""           
    end if
  case else
    ShowLoginForm ""
    ShowCreateForm ""
end Select

' ------------------------------------------
' Funktioner og Procedurer
' ------------------------------------------

function CheckUser(strEmail, strPassword)
  dim objRS, strSQL
  dim boolRes

  strSQL = "SELECT id, lastlogin FROM webusers " & _
          "WHERE email = '" & strEmail & "' AND password = '" & strPassword & "'"
  set objRS = server.createobject("ADODB.Recordset")
  with objRS
    .open strSQL, strConnect, adOpenStatic, adLockOptimistic, adCmdText
    if not .EOF then
      Session("activeuser") = .Fields("id")
      .Fields("lastlogin") = now()
      .Update -------------------------------------DETTE ER LINIE 678 ------------
      boolRes = TRUE
    else
      Session("activeuser") = -1
      boolRes = FALSE
    end if
    .close
  end with
  set objRS = Nothing
  CheckUser = boolRes
end function


sub ShowCreateForm (strEmail)
  response.write _
    "<form action='usermanager.asp?page=" & _
  server.urlencode(strPage) & "' method=post>" & _
  " <table width='200' border='0' cellspacing='0' cellpadding='0'>" & _
    " <tr>" & _
        "<td colspan='2' align='left'><span class='style3'>HVIS DU ER NY BRUGER:</span> <BR><BR></td>" & _
      "</tr>" & _
      "<tr>" & _
        "<td width='87' align='left'>Email</td>" & _
        "<td width='84' align='left'><input type='text' class='text' size='19' name='email' value='" & strEmail & "'></td>" & _
      "</tr>" & _
      "<tr>" & _
        "<td align='left'>Password</td>" & _
        "<td align='left'><input type='password' size='19' name='password' class='text'></td>" & _
      "</tr>" & _
      "<tr>" & _
        "<td align='left'>Navn</td>" & _
        "<td align='left'><input type='text' size='19' name='fullname' class='text'></td>" & _
      "</tr>" & _
      "<tr>" & _
        "<td>&nbsp;</td>" & _
        "<td align='left'> <input type='hidden' value='write' name='action'>" & _
       
        "<button type='submit'  class='login'>  &nbsp;  &nbsp;  &nbsp;    OPRET  &nbsp;  &nbsp;  &nbsp;    </button>" & _
       
       
       
  " </td>" & _
      "</tr>" & _
      "<tr>" & _
        "<td>&nbsp;</td>" & _
        "<td>&nbsp;</td>" & _
      "</tr>" & _
    "</table>" & _
    "</form>"
end sub


sub ShowLoginForm (strEmail)
  response.write _
    "<form action='usermanager.asp?page=" & _
  server.urlencode(strPage) & "' method=post>" & _
  " <table width='200' border='0' cellspacing='0' cellpadding='0'>" & _
    " <tr>" & _
        "<td colspan='2' align='left'><span class='style3'>LOGIN:</span> <BR><BR></td>" & _
      "</tr>" & _
      "<tr>" & _
        "<td width='87' align='left'>Email</td>" & _
        "<td width='84' align='left'><input type='text' class='text' size='19' name='email' value='" & strEmail & "'></td>" & _
      "</tr>" & _
      "<tr>" & _
        "<td align='left'>Password</td>" & _
        "<td align='left'><input type='password' size='19' name='password' class='text'></td>" & _
   
      "<tr>" & _
        "<td>&nbsp;</td>" & _
       
       
       
        "<td align='left'> <input type='hidden' value='login' name='action'>" & _
       
        "<button type='submit'  class='login'>  &nbsp;  &nbsp;  &nbsp;    LOGIN  &nbsp;  &nbsp;  &nbsp;    </button>" & _
       
       
       
  " </td>" & _
      "</tr>" & _
      "<tr>" & _
        "<td>&nbsp;</td>" & _
        "<td>&nbsp;</td>" & _
      "</tr>" & _
    "</table>" & _
    "</form>"



Kan nogle hjælpe?


vh

Frida
Avatar billede thesurfer Nybegynder
18. april 2006 - 19:10 #1
Hmm.. den siger at kolonnen "lastlogin" ikke eksisterer.. se lige om det er nøjagtigt sådan det staves..

/theSurfer
Avatar billede thesurfer Nybegynder
18. april 2006 - 19:12 #2
Hmm.. hvis "lastlogin" ikke eksisterer, burde den melde fejl i denne linie:

.open strSQL, strConnect, adOpenStatic, adLockOptimistic, adCmdText

/theSurfer
Avatar billede frida Nybegynder
18. april 2006 - 21:09 #3
jo - lastlogin  - eksisterer, og datoen lægges også heri. Som sagt - databasen opdateres, som den skal, når der oprettes en ny bruger. Der kommer bare den famøse fejlmeddelelse. - Og det forstår jeg ikke
Avatar billede thesurfer Nybegynder
18. april 2006 - 23:40 #4
Prøv at lave en backup af din ASP fil, og erstat din CheckUser funktion med denne CheckUser funktion:

function CheckUser(strEmail, strPassword)
dim rs, strSQL, conn, dsn
dim boolRes

strSQL = "SELECT id, lastlogin FROM webusers " & _
          "WHERE email = '" & strEmail & "' AND password = '" & strPassword & "'"

Set Conn = Server.CreateObject("ADODB.Connection")
DSN = "DRIVER={Microsoft Access Driver (*.mdb)}; "
DSN = DSN & "DBQ=" & Server.MapPath("sti_til_databasen.mdb") ' sti til databasen
Conn.Open DSN

Set rs = Conn.Execute(strSQL)

if not rs.bof or rs.eof then
      Session("activeuser") = rs("id")
            strSQL = "update webusers set lastlogin = #" & now() & "# where email = '" & strEmail & "' AND password = '" & strPassword & "'"
            Conn.Execute(strSQL)
            boolRes = TRUE
else
      Session("activeuser") = -1
      boolRes = FALSE
end if
set rs = nothing
set conn = nothing

CheckUser = boolRes
end function



Erstat "sti_til_databasen.mdb" med stien til din databasen + filnavn..

/theSurfer
Avatar billede thesurfer Nybegynder
19. april 2006 - 00:18 #5
Beskrivelse fra http://www.aspfaq.com/show.asp?id=2009 :

"Microsoft OLE DB Provider for ODBC Drivers (0x80004005)
Query-based update failed because the row to update could not be found.    "

You are using MySQL, have opened a recordset that does not include a primary key, and have issued rs.update() in an attempt to modify a single row. Use an UPDATE statement.

/theSurfer
Avatar billede frida Nybegynder
19. april 2006 - 10:56 #6
Jeg forstår ganske enkelt ikke ?(

"...have opened a recordset that does not include a primary key".
- ID er primærnøgle!
"...and have issued rs.update() in an attempt to modify a single row. Use an UPDATE statement."
- Og har anvendt rs.update() i et forsøg på at ændre en enkelt række... Jamen er det ikke UPDATE statement jeg bruger?

Jeg prøver lige at skifte ud med dit forslag.
Avatar billede thesurfer Nybegynder
19. april 2006 - 11:20 #7
Jeg har ikke testet koden, men det er noget i den stil..

/theSurfer
Avatar billede frida Nybegynder
19. april 2006 - 12:18 #8
Jeg har forsøgt mig dit forslag, men får følgende fejl:

Microsoft OLE DB Provider for ODBC Drivers error '80040e14'

[MySQL][ODBC 3.51 Driver][mysqld-3.23.58]You have an error in your SQL syntax near '' at line 1

usermanager.asp, line 698


------------------

function CheckUser(strEmail, strPassword)
dim rs, strSQL, conn, dsn
dim boolRes

strSQL = "SELECT id, lastlogin FROM webusers " & _
          "WHERE email = '" & strEmail & "' AND password = '" & strPassword & "'"

Set Conn = Server.CreateObject("ADODB.Connection")
dsn = _
    "Driver={MySQL ODBC 3.51 Driver};" & _
    "Server=mysql.xxxxxxxx.dk;" &_
    "Port=3306;" & _
    "Option=131072;" & _
    "Stmt=;" & _
    "Database=xxxxxxxxxxx;" & _
    "Uid=xxxxxxxxx;" & _
    "Pwd=xxxxxxx"


  Set Conn = Server.CreateObject("ADODB.Connection")
  Conn.Open strConn

Set rs = Conn.Execute(strSQL)

if not rs.bof or rs.eof then
      Session("activeuser") = rs("id")
            strSQL = "update webusers set lastlogin = #" & now() & "# where email = '" & strEmail & "' AND password = '" & strPassword & "'"
            Conn.Execute(strSQL)      ---------------LINIE 698 ----------
            boolRes = TRUE
else
      Session("activeuser") = -1
      boolRes = FALSE
end if
set rs = nothing
set conn = nothing

CheckUser = boolRes
end function

------------------------------------

Der sker det samme. Den nye bruger bliver godt nok oprettet i databasen, men fejlmeddelelsen kommer. Der sker så også yderligere det, at brugeren ikke - som før - efterfølgende kan logge sig ind, som kendt bruger. 

Hvorfor kommer der en fejlmeddelelse, når der fint kan lægges i databasen... ?
Avatar billede thesurfer Nybegynder
19. april 2006 - 12:27 #9
Jeg tror ikke at det er derfor, men prøv lige denne linie i stedet for den nuværende:

if not (rs.bof or rs.eof) then

/theSurfer
Avatar billede thesurfer Nybegynder
19. april 2006 - 12:30 #10
Du burde også bare kunne bruge:

strSQL = "update webusers set lastlogin = #" & now() & "# where id = " & CInt(Session("activeuser"))

Det skal lige siges, at CInt(Session("activeuser")) kan erstattes af CInt(rs("id"))

CInt konverterer værdien til integer, hvilket er type af feltet "id"..

http://www.w3schools.com/vbscript/vbscript_ref_functions.asp

/theSurfer
Avatar billede thesurfer Nybegynder
19. april 2006 - 12:31 #11
Er du sikker på at der skal være "()" bag "Now()"?
Normalt bruger man bare "Now"..

/theSurfer
Avatar billede frida Nybegynder
19. april 2006 - 12:53 #12
if not (rs.bof or rs.eof) then
giver samme fejl.


strSQL = "update webusers set lastlogin = #" & now() & "# where id = " & CInt(Session("activeuser"))

giver også samme fejl

Now() har jeg brugt andet sted - ved opdatering af indkøbsvognen - og det fungerer fint. Og det gør det jo også i dette tilfælde, for alt bliver jo opdateret korrekt i databasen - email, password, navn og lastlogin

Se udtræk fra db - sidste eksempel:
(id)30 (email) tonny@adfsdfsdf.dk (password) tonny (navn) Tonny (lastlogin) 2006-04-19 12:41:08

Hvorfor den fejlmeddelelse alligevel kommer - er mig totalt uforståeligt....
Avatar billede thesurfer Nybegynder
19. april 2006 - 13:11 #13
Hmm.. underligt..
Dvs, alt er ok, men den melder fejl?

Man kunne fuske lidt.. brug "on error resume next".. Det gør at den fortsætter, selvom der opstår fejl..

Linie 1 bør altid være: Option Explicit
Forklaring på Option Explicit:
Man bør altid bruge Option explicit som første linie. Den tvinger programmøren til at definere alle variablerne. På den måde kan den finde "stavefejl". Hvis man skriver navnet på en variabel, som ikke er defineret, melder den automatisk fejl.

Linie 2: On Error Resume Next
Forklaring på On Error Resume Next:
Scriptet fortsættes, selvom der opstår fejl. Fejlen kan "aflæses" via Err.
Fejl 0 = Alt OK.. Andet end 0 = noget galt
Eksempel:

if err.number <> 0 then
' der er noget galt
response.write err.number & err.description
end if

Hvis der er noget galt, udskrives fejl-koden og fejl-meddelelsen.

Man kunne bruge On Error Resume Next og denne kode:

if err.number <> 0 then

if not ( instr(err.description, "Query-based update failed because the row to update could not be found.") or instr(err.description, "Query-based update failed because the row to update could not be found.") ) then

' der er opstået en anden fejl, end dem vi lige har set.. udskriv fejlen:

response.write "Der er sket en fejl:<br><br>" & err.number & " - " & err.description

end if

end if

Totalt fusket..

/theSurfer
Avatar billede frida Nybegynder
19. april 2006 - 14:45 #14
Ja - alt er ok, men den melder fejl!?

Og - jeg er jo ikke meget for at lave alt for meget fusk - skidtet skal jo virke, og det er da også lidt interessant, hvorfor den fejlmeddelelse overhovedet kommer.

Jeg kigger på dine fuskerier - og vender tilbage senere. Skal lidt ud i solen :o)

Håber du vil hænge på ..
Avatar billede thesurfer Nybegynder
20. april 2006 - 09:42 #15
Jojo.. jeg er i nærheden.. :-)

/theSurfer
Avatar billede frida Nybegynder
20. august 2006 - 15:36 #16
Sommeren er næsten gået og jeg er ikke kommet videre! Jeg lukker derfor spørgsmålet og siger tak for hjælpen.

vh
Frida
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