18. april 2006 - 18:32Der 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"
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
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
"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.
"...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?
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... ?
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....
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
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)
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
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.