24. maj 2004 - 21:59Der er
82 kommentarer og 1 løsning
validering samt check i database
jeg ønsker at validere feltet 'oldpassword' med det der er i databasen i forvejen - hvis disse ikke er ens skal der komme en fejlmelding.
samtidig ønsker jeg at validere de to felter 'newpassword' og 'newpassword2' - disse skal være ens og ikke tomme ellers skal der komme en fejlmelding.
jeg har siddet og rodet med dette i et stykke tid nu uden resultat. har ingen ide om hvordan jeg tjekker i databasen da alt det her asp bare er held fra min side :) og validerings scriptet lader ikke til at køre.
<%@language="vbscript" %>
<!--#include file="../connect.asp"-->
<% Set administrator = Server.CreateObject("ADODB.Recordset") administrator.Open "SELECT * FROM administrator WHERE administrator.adminid = " & Request.QueryString("show_id"), database
<!--javascript der validerer felterne 'newpassword' og 'newpassword2'-->
<script type="text/javascript"> function validForm(passForm) { if (passForm.newpassword.value == "") { alert("du skal skrive et kodeord"); passForm.newpassword.focus(); return false; } if (passForm.newpassword.value != passForm.newpassword2.value) { alert("de indtastede kodeord er ikke ens"); passForm.newpassword.focus(); passForm.newpassword.select(); return false; } return true; } </script>
<a href="#" onclick="document.user.submit();return false;"><b>gem ændringer</b></a> <---- er dette måske problemet - jeg vil helst ikke bruge en knap da det bryder mit design
hmm.. jeg læste dit spm igen.. der er 2 dele.. den ene del er ASP, og den anden JavaScript..
Denne del er ASP: "jeg ønsker at validere feltet 'oldpassword' med det der er i databasen i forvejen - hvis disse ikke er ens skal der komme en fejlmelding."
Med lidt mere info, kan ASP delen godt løses her..
<% function dbopen() Set Conn = Server.CreateObject("ADODB.Connection") DSN = "DRIVER={Microsoft Access Driver (*.mdb)}; " DSN = DSN & "DBQ=" & Server.MapPath("db1.mdb") Conn.Open DSN end function
function dbclose() conn.close set conn = nothing set rs = nothing end function %>
Til tabellen er brugt: tabel: navn=tblProfil felt: navn=brugernavn, type=tekst felt: navn=kode, type=tekst
koden:
<% option explicit %> <!-- #include file="db_conn.asp" --> <% dim strSQL, rs, conn, dsn dim tmpInfo
function HentBrugere()
dbopen strSQL = "select * from tblProfil" set rs = conn.execute(strSQL)
if not (rs.bof or rs.eof) then tmpInfo = "" do while not rs.eof tmpInfo = tmpInfo & "brugernavn: <b>" & rs("brugernavn") & "</b>, kode: <b>" & rs("kode") & "</b><br>" rs.movenext loop end if dbclose tmpInfo = tmpInfo end function
HentBrugere ' hent brugere
dim besked
if request.servervariables("request_method") = "POST" then
strSQL = "Select * from tblProfil where kode = '" & oldpw & "'" set rs = conn.execute(strSQL)
if not (rs.bof or rs.eof) and fejl = "nej" then dim strSQL_Update strSQL_Update = "Update tblProfil Set kode = '" & newpw & "' Where kode = '" & oldpw & "'" conn.execute(strSQL_Update) else fejl = "ja" end if ' rs-check
dbclose HentBrugere ' hent brugere
besked = "<font color='#009000'>Profilen er nu opdateret</font>" else fejl = "ja" end if ' len pw
if fejl = "ja" then besked = "<font color='#ff0000'>Der er fejl i password. Ret venligst data'ene og prøv igen.</font>"
dim oldpass, tmpuser, newpass, newpass2 oldpass = oldpw tmpuser = request.form("username") newpass = request.form("newpassword") newpass2 = request.form("newpassword2") end if
<!--javascript der validerer felterne 'newpassword' og 'newpassword2'-->
<script type="text/javascript"> function validForm(passForm) { if (passForm.newpassword.value == "") { alert("du skal skrive et kodeord"); passForm.newpassword.focus(); return false; } if (passForm.newpassword.value != passForm.newpassword2.value) { alert("de indtastede kodeord er ikke ens"); passForm.newpassword.focus(); passForm.newpassword.select(); return false; } return true; } </script>
</head>
<body leftmargin="0" rightmargin="0" topmargin="0" marginwidth="0" marginheight="0"> <!--overordnet tabel der viser indholdet af databasen placeret i CSS layer-->
<a href="#" onclick="document.user.submit();return false;"><b>gem ændringer</b></a> <---- er dette måske problemet - jeg vil helst ikke bruge en knap da det bryder mit design
</td>
</tr>
</table>
</div>
<% response.write "<span style='position: absolute; top: 300px;'><hr>Brugere i databsen (inkl. kodeord):<br>" & tmpInfo if besked <> "" then response.write "<br><br>" & besked response.write "</span>" %>
Nogle ting som du måske undrer dig over * layoutet på online demo - jeg har ikke din css fil
* <input type="hidden" name="admin" value="<% '=administrator("adminid") ' jeg forstår ikke helt denne linie %>"> - ja, jeg forstod ikke helt meningen med linien..
* <form name="user" action="index.asp" method="post" - Jeg har ændret action til "index.asp", da jeg ikke gider at skrive filnavnet, når jeg tester på min maskine.. og normalt bruger man POST som submit-metoden, når man bruger brugernavn/kodeord
den linie du ikke forstår var bare en test jeg har glemt at fjerne for at se om den tod adminid med.
nu får jeg denne fejlmeddelelse. har lavet en db_conn.asp fil som du gav koden til. og egentlig bare pasted det du har lavet der.
Microsoft OLE DB Provider for ODBC Drivers error '80004005'
[Microsoft][ODBC Microsoft Access Driver]General error Unable to open registry key 'Temporary (volatile) Jet DSN for process 0xccc Thread 0xe40 DBC 0x2474f74 Jet'.
Til tabellen er brugt: tabel: navn=tblProfil felt: navn=brugernavn, type=tekst felt: navn=kode, type=tekst
det her er dine navne i db'en korrekt?
/code/users/users.asp, line 13
får nemlig ham her :) men det er jo lige til at ændre - tror jeg - hvis det bare er dine tabelnavne
Microsoft OLE DB Provider for ODBC Drivers error '80040e37'
[Microsoft][ODBC Microsoft Access Driver] The Microsoft Jet database engine cannot find the input table or query 'tblProfil'. Make sure it exists and that its name is spelled correctly.
tmpInfo = "" do while not rs.eof tmpInfo = tmpInfo & "brugernavn: <b>" & rs("brugernavn") & "</b>, kode: <b>" & rs("kode") & "</b><br>" <-----------hvad med denne linie? der bruger du også tempinfo rs.movenext loop end if dbclose tmpInfo = tmpInfo end function
Har du oprettet tabellen "tblProfil"? Hvis ikke, så skal du gøre det først.. Inde i tblProfil, skal du oprette 2 felter ("brugernavn" og "kode"), begge af typen tekst.
tmpInfo-koden kan slettes, sammen med funktionen HentBrugere, og alle henvisninger til funktionen.
Erstat alle steder hvor der står "brugernavn" med "navn", og "kode" med "[password]".. Grunden til at man bruger [], er fordi "password" er et reserveret ord..
strSQL = "Select * from administrator where password = '" & oldpw & "'" set rs = conn.execute(strSQL)
if not (rs.bof or rs.eof) and fejl = "nej" then dim strSQL_Update strSQL_Update = "Update tblProfil Set password = '" & newpw & "' Where password = '" & oldpw & "'" conn.execute(strSQL_Update) else fejl = "ja" end if ' rs-check
dbclose HentBrugere ' hent brugere
besked = "<font color='#000000'>Profilen er nu opdateret</font>" else fejl = "ja" end if ' len pw
if fejl = "ja" then besked = "<font color='#000000'>Der er fejl i kodeordet. Ret venligst og prøv igen.</font>"
dim oldpass, tmpuser, newpass, newpass2 oldpass = oldpw tmpuser = request.form("username") newpass = request.form("newpassword") newpass2 = request.form("newpassword2") end if
<!--javascript der validerer felterne 'newpassword' og 'newpassword2'-->
<script type="text/javascript"> function validForm(passForm) { if (passForm.newpassword.value == "") { alert("du skal skrive et kodeord"); passForm.newpassword.focus(); return false; } if (passForm.newpassword.value != passForm.newpassword2.value) { alert("de indtastede kodeord er ikke ens"); passForm.newpassword.focus(); passForm.newpassword.select(); return false; } return true; } </script>
</head>
<body leftmargin="0" rightmargin="0" topmargin="0" marginwidth="0" marginheight="0"> <!--overordnet tabel der viser indholdet af databasen placeret i CSS layer-->
strSQL = "Select * from administrator where password = '" & oldpw & "'" set rs = conn.execute(strSQL)
if not (rs.bof or rs.eof) and fejl = "nej" then dim strSQL_Update strSQL_Update = "Update administrator Set password = '" & newpw & "' Where password = '" & oldpw & "'" conn.execute(strSQL_Update) else fejl = "ja" end if ' rs-check
dbclose
besked = "<font color='#000000'>Profilen er nu opdateret</font>" else fejl = "ja" end if ' len pw
if fejl = "ja" then besked = "<font color='#000000'>Der er fejl i kodeordet. Ret venligst og prøv igen.</font>"
dim oldpass, tmpuser, newpass, newpass2 oldpass = oldpw tmpuser = request.form("username") newpass = request.form("newpassword") newpass2 = request.form("newpassword2") end if
<!--javascript der validerer felterne 'newpassword' og 'newpassword2'-->
<script type="text/javascript"> function validForm(passForm) { if (passForm.newpassword.value == "") { alert("du skal skrive et kodeord"); passForm.newpassword.focus(); return false; } if (passForm.newpassword.value != passForm.newpassword2.value) { alert("de indtastede kodeord er ikke ens"); passForm.newpassword.focus(); passForm.newpassword.select(); return false; } return true; } </script>
</head>
<body leftmargin="0" rightmargin="0" topmargin="0" marginwidth="0" marginheight="0"> <!--overordnet tabel der viser indholdet af databasen placeret i CSS layer-->
Fjern linien. @-linier skal være de først, på hoved-siden.. dvs, den indlæser de andre sider.. Da "db_conn.asp" er en underside, som er inkluderet via <!-- #include file="../db_conn.asp" -->, må der IKKE være @-linier, eller "Option Explicit"..
"Band of Brothers" på DR2 er lige startet.. ses! :-)
<% Set administrator = Server.CreateObject("ADODB.Recordset") administrator.Open "SELECT * FROM administrator WHERE administrator.adminid = " & Request.QueryString("show_id"), database
%>
jeg har brug for den Request.QueryString("show_id") da jeg tager brugerens id med fra login. sagen er den at denne fil vi roder med nu åbnes fra et fælles kontrolpanel med 2 administratorer. det skal ikke være muligt for dem at ændre hinandens password jo.
kan det måske skyldes at denne sql skal bruges på en eller anden måde?
Når man bruge login osv, bruger man gerne sessions.. f.eks. her på Eksperten.dk.. når browseren lukkes ned, slettes sessionen, og man skal logge ind næste gang.. Til en auto-login, som her på eksperten, bruges der cookies..
Din situation: Jeg går ud fra, at man først skal logge ind? Der kan du sætte en session, til at holde øje med hvem der er logget ind.. og så kan du bruge noget i stil med:
"select * fom administrator where navn = "' & session("bruger_som_er_logget_ind") & "'"
ja det har jeg allerede lavet noget i stil med... men det virker heller ikke. :D jeg troede jeg havde oprettet et spørgsmål med dette herinde men lader ikke til det. nå men tilbage til det her:
hvis vi nu går tilbage til min oprindelige kode... er der så ikke en simplere måde at få den til at tjekke om feltet er ens med det der bliver indtastet? den javascript validator jeg har fået i javascript kategorien fungere fint selvom det er klart fede med den tekst løsning du bruger i stedet for en alertbox... sagen er den at dette er til min hovedopgave der skal afleveres torsdag kl 12 :)
men kan der ikke laves en simplere løsning end det du havde kodet der? for jeg kan ikke få det til at virke. Det der ligger på nettet er version fra igår
hmmm næ den logger ikke ud... det skulle den jo helst når man lukker vinduet med kontrolpanelet... hvordan den gøres er så endnu et mysterie - herligt at kaste sig ud i sådan noget her når man er en total asp noob :)
mht "Variable is undefined: 'administrator'".. prøv min metode med: set rs = conn.execute("SELECT * FROM administrator WHERE administrator.adminid = " & Request.QueryString("show_id"), database"
mht logout: normalt er det først når hele browseren (læs: alle browserens vinduer) lukkes.. dermed nedlægges sessionerne..
Jeg har engang lavet et login system, der bruger sessions.. der kan man logge ind, og skifte nogle data.. bl.a passwordet der hører til den konto/profil, som man har brugt til login.. man kan altså ikke skifte de andres passwords..
mht "Variable is undefined: 'administrator'".. prøv min metode med: set rs = conn.execute("SELECT * FROM administrator WHERE administrator.adminid = " & Request.QueryString("show_id"), database"
ok det der fangede jeg ikke? mener du jeg skal ændre
strSQL = "Select * from administrator where password = '" & oldpw & "'" set rs = conn.execute(strSQL)
til
strSQL = "Select * from administrator where password = '" & oldpw & "'" set rs = conn.execute("SELECT * FROM administrator WHERE administrator.adminid = " & Request.QueryString("show_id"), database"
<% Set administrator = Server.CreateObject("ADODB.Recordset") administrator.Open "SELECT * FROM administrator WHERE administrator.adminid = " & Request.QueryString("show_id"), database
%>
I stedet for at bruge administrator.Open, brug: set rs = conn.execute("SELECT * FROM administrator WHERE administrator.adminid = " & Request.QueryString("show_id"))
Så kan du bruge rs("adminid")..
Hvad er "database" i din linie?: "& Request.QueryString("show_id"), database"
ja... men den sql eller set rs eller hvad det nu bliver er jo fra min oprindelige kode... jeg kan slet ikke finde hoved eller hale i det her mere...
mht database... jeg ved det heller ikke... noget min lærer har lært os tror jeg nok... ved ikke hvad den gør, men tror det er en henvisning til linien over?
jeg vil bare så gerne vide hvordan jeg får den her til at finde mine værdier fra databasen igen... det gør den bestemt ikke nu.
Jeg har lært det med ASP og database vha html.dk.. den metode du bruger der, kender jeg ikke så godt.. eller, ikke nok til at jeg kan bruge den.. Når man bruge den metode, plejer men at bruge den sådan her: noget.open "selec...", 1, 3 jeg kan ikke huske hvad 1 og 3 gør.. noget med at låse nogle felter eller noget i den stil..
Jeg tror at jeg kan lave, et funktionelt login system med sessions, i morgen.. det bliver med "set rs = conn.execute" metoden..
- Er du interesseret i det, eller vil du beholde "noget.open" metode (som jeg desværre ikke kan hjælpe med) ?
PS: hvad er det for en uddannelse du er igang med?
nej det er fint nok med den anden metode... jeg tror bare jeg har kastet mig ud i nogen forskellige former da jeg henter det meste af min kode fra eksempler og prøver at tilpasse. Jeg har været alle html.dk tutorials igennem - men jeg lærer åbenbart aldrig asp, og det samme gælder javascript :)
jeg er 3 uger fra at være multimedie designer - men hver sikker på at de fremtidige jobs ikke skal indeholde kode :D
hvis du har tid lidt endnu... så lad os lige prøve noget andet hvis det er ok - hvis du ser på min oprindelige kode... hvordan ændrer jeg så den til rs? og hvordan kan jeg validere formen uden al den ekstra kode - det virker for mig - correct me if i'm wrong - som om at det meste af det du har kodet er til fejlmeldingerne?
ja det haster en del da al kode helst skulle være færdig i morgen aften :)
men du mener altså ikke der er en simplere måde at lave den der validering af feltet? det eneste jeg jo mangler er validering af feltet med det gamle password. den javascript der kører giver fint alert hvis de 2 sidste ikke stemmer. kunne man lave noget lignende?
Der er mange ting, som skal være iorden, før man "korrekt" kan ændre en værdi.. man skal jo sørge for, at de felter i databasen, man vil arbejde med, ikke er tomme.. og så skal ' tegnet enten erstattes med ingenting, eller med dobbelt ' tegn, som opfattes som et enkelt ' tegn..
Så, jo, der er en masse kode til fejlmeldinger..
Jeg ville helt klart bruge sessions til dette eksempel..
Sql = "SELECT COUNT(*) as Found from administrator WHERE (navn = '" & strBrugernavn & "') and (password ='" & strPassword & "')" Set LO = RS.Execute(Sql) if LO("Found") = 0 then Session("login") = "NO" error = "Det indtastede brugernavn eller kodeord er ikke korrekt" else strDSN = "DRIVER={Microsoft Access Driver (*.mdb)};DBQ=" & Server.MapPath("/db/hpff.mdb") Set myConn = Server.CreateObject("ADODB.Connection") myConn.Open strDSN strSQL = "SELECT * FROM administrator where (navn = '" & Request("navn") & "') and (password ='" & Request("password") & "')" Set ez = myConn.Execute(strSQL) Session("login") = "YES" Session("strAdminid") = 1 Response.Redirect "../kontrolpanel/kontrolpanel.asp" EZ.Close RS.Close myConn.Close end if end if %>
Session("login") = "YES" Session("strAdminid") = 1 <--- denne linie virker KUN hvis jeg forudbestemmer værdien Response.Redirect "../kontrolpanel/kontrolpanel.asp"
Jeg kan ikke lige gennemskue din kode.. jeg tror at du skal have fat i en af de andre..
Du kan se hvilke spm de har oprette, ved at kopiere og indsætte dette link, i url-området af dit browser vindue, og erstatte BRUGERNAVN med navnet på brugeren:
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.