15. august 2007 - 01:24Der er
18 kommentarer og 1 løsning
Validering - samme brugernavn må ikke oprettes flere gange
Jeg har en database som hedder medlemmer. I denne database er der et felt som hedder brugernavn. Det er et tekstfelt med indekseret: Ja - ingen dubletter.
Jeg har en tilmeldingsformular med validering på felter, hvor der er krav om indtastning.
I denne formular er der et felt der hedder brugernavn
Dataene bliver sendt til modtag.asp og asp-koden ser sådan ud:
<% 'Validering af felterne alder og karakter 'Hvis feltet alder ikke indeholder et tal 'Hvis felterne navn ingame karakter og password er blanke If Not isNumeric(Request.Form("alder")) Then Response.Write "<p>Du skal vælge en alder!</p>" If Request.Form("navn")="" Then Response.Write "<p>Du skal skrive dit navn!</p>" If Request.Form("ingame")="" Then Response.Write "<p>Du skal skrive dit navn ingame. Hvis du ikke har et skriver du bare: Ingen!</p>" If Request.Form("karakter")="" Then Response.Write "<p>Du skal vælge en karakter. Hvis du ikke har valgt en karakter endnu, skal du vælge: Andet!</p>" If Request.Form("brugernavn")="" Then Response.Write "<p>Du skal skrive et brugernavn!</p>" If Request.Form("pass")="" Then Response.Write "<p>Du skal skrive et password!</p>" Response.Write "<p><a href='java script:history.go(-1)' class='link'>Prøv igen</a></p>" %>
<% 'Hvis det indtastede i felterne opfylder kravene så If isNumeric(Request.Form("alder")) And Not Request.Form("karakter")="" And Not Request.Form("navn")="" And Not Request.Form("ingame")="" And Not Request.Form("pass")="" Then
' Tilføj data i database strSQL = "Insert into Medlemmer (Navn, Ingame, Karakter, Altkarakter, Adresse, Postnummer, Town, Telefonnummer, Mailadresse, Alder, Brugernavn, Password) values('"&Request.Form("navn")&"', '"&Request.Form("ingame")&"', '"&Request.Form("karakter")&"', '"&Request.Form("altkarakter")&"', '"&Request.Form("adresse")&"', '"&Request.Form("postnr")&"', '"&Request.Form("by")&"', '"&Request.Form("telefon")&"','"&Request.Form("mail")&"','"&Request.Form("alder")&"','"&Request.Form("brugernavn")&"','"&Request.Form("pass")&"')"
' SQL sætning eksekveres Conn.Execute(strSQL)
'Sender en til kvittering response.Redirect("tilmeld_kvittering.htm")
'Luk databaseforbindelse Conn.Close Set Conn = Nothing %>
<% 'Slut End If %>
Jeg kunne godt tænke mig en validering på formularfeltet brugernavn sådan at det samme brugernavn ikke kan blive valgt mere end én gang.
Lige nu får man en fejlmelding fra databasen og der synes jeg ikke ser særligt smart ud:
Microsoft OLE DB Provider for ODBC Drivers error '80040e14'
[Microsoft][ODBC Microsoft Access Driver] The changes you requested to the table were not successful because they would create duplicate values in the index, primary key, or relationship. Change the data in the field or fields that contain duplicate data, remove the index, or redefine the index to permit duplicate entries and try again.
/asp/modtag.asp, line 39
Mon ikke der er nogen herinde, der kan hjælpe mig med det?
DU kan tjekke om det findes, inden du kører din strSQL:
Set rs=Conn.Execute("SELECT [brugernavn] FROM [medlemmer] WHERE [brugernavn]='"&Request.Form("brugernavn")&"'") If rs.EOF Then strSQL = "Insert into...... Else Response.Write "Dette brugernavn findes allerede!" End If
Jeg ville helt klart også smide et "unike" på brugernavn feltet i databasen. På den måde forhindre DB'en 100% at der ikke kommer ens data, da men nemt kan glemme at gøre det selv i koden.
Jeps. "Ja - ingen dubletter" sikre at samme data ikke må stå 2 gange.
Du skal dog stadig bruge soerenlyn's kode til at tjekke for om brugernavnet eksistere. Evt kan du slå fejlhåndtering til, og lade den styre det i stedet:
on error resume next '<-- Start manuel fejlhåndtering Conn.Execute(strSQL) if err.code <> 0 then response.write "Der skete en fejl." end if on error goto 0 '<-- Reset til default fejlhåndtering
Du burde får forskellige fejlkoder afhængig af om det er en "unike" fejl eller datatype fejl (hvis der f.eks er indtastet tekst i felter som kun godtager tal), men de fejlkoder kan jeg ikke uden af. Men det ville så være noget i denne stil:
on error resume next '<-- Start manuel fejlhåndtering Conn.Execute(strSQL) if err.code <> 0 then if err.code=1112 then 'Unike fejl response.write "Bruger eksistere allerede" elseif err.code=1113 then 'Datatype fejl response.write "Forkert data i felter" else 'Alle andre fejl response.write "Der skete en fejl ("& err.description &")" end if end if on error goto 0 '<-- Reset til default fejlhåndtering
if sætningen kan udbygges med alle de fejlkoder som der nu kan opstå hvis man vil.
Nu ser min kode sådan ud, men jeg får et mystisk resultat - hvor går det galt.
Resultatet jeg får:
Dette brugernavn findes allerede! Microsoft OLE DB Provider for ODBC Drivers error '80040e0c'
Command text was not set for the command object.
/asp/modtag.asp, line 46
Linie 46= Conn.Execute(strSQL) -----------skal det slettes?
Koden:
<% 'Validering af felterne alder og karakter 'Hvis feltet alder ikke indeholder et tal 'Hvis felterne navn ingame karakter og password er blanke If Not isNumeric(Request.Form("alder")) Then Response.Write "<p>Du skal vælge en alder!</p>" If Request.Form("navn")="" Then Response.Write "<p>Du skal skrive dit navn!</p>" If Request.Form("ingame")="" Then Response.Write "<p>Du skal skrive dit navn ingame. Hvis du ikke har et skriver du bare: Ingen!</p>" If Request.Form("karakter")="" Then Response.Write "<p>Du skal vælge en karakter. Hvis du ikke har valgt en karakter endnu, skal du vælge: Andet!</p>" If Request.Form("brugernavn")="" Then Response.Write "<p>Du skal skrive et brugernavn!</p>" If Request.Form("pass")="" Then Response.Write "<p>Du skal skrive et password!</p>" Response.Write "<p><a href='java script:history.go(-1)' class='link'>Prøv igen</a></p>" %>
<% 'Hvis det indtastede i felterne opfylder kravene så If isNumeric(Request.Form("alder")) And Not Request.Form("karakter")="" And Not Request.Form("navn")="" And Not Request.Form("ingame")="" And Not Request.Form("pass")="" Then
Set rs=Conn.Execute("SELECT [brugernavn] FROM [medlemmer] WHERE [brugernavn]='"&Request.Form("brugernavn")&"'") If rs.EOF Then ' Tilføj data i database strSQL = "Insert into Medlemmer (Navn, Ingame, Karakter, Altkarakter, Adresse, Postnummer, Town, Telefonnummer, Mailadresse, Alder, Brugernavn, Password) values('"&Request.Form("navn")&"', '"&Request.Form("ingame")&"', '"&Request.Form("karakter")&"', '"&Request.Form("altkarakter")&"', '"&Request.Form("adresse")&"', '"&Request.Form("postnr")&"', '"&Request.Form("by")&"', '"&Request.Form("telefon")&"','"&Request.Form("mail")&"','"&Request.Form("alder")&"','"&Request.Form("brugernavn")&"','"&Request.Form("pass")&"')" Conn.Execute(strSQL) Else Response.Write "Dette brugernavn findes allerede!" End If
Det dutter ikke - jeg får bare kvittering uden at der bliver tilføjet noget til databasen, og jeg skulle jo egentlig have haft fejlmeldingen "Dette brugernavn findes allerede!"
Kvittering
Du er nu tilføjet på spillerlisten, og du kan til ehver tid afmelde dig igen.
Tilbage til spillerlisten
Koden ser nu sådan ud:
<% 'Validering af felterne alder og karakter 'Hvis feltet alder ikke indeholder et tal 'Hvis felterne navn ingame karakter og password er blanke If Not isNumeric(Request.Form("alder")) Then Response.Write "<p>Du skal vælge en alder!</p>" If Request.Form("navn")="" Then Response.Write "<p>Du skal skrive dit navn!</p>" If Request.Form("ingame")="" Then Response.Write "<p>Du skal skrive dit navn ingame. Hvis du ikke har et skriver du bare: Ingen!</p>" If Request.Form("karakter")="" Then Response.Write "<p>Du skal vælge en karakter. Hvis du ikke har valgt en karakter endnu, skal du vælge: Andet!</p>" If Request.Form("brugernavn")="" Then Response.Write "<p>Du skal skrive et brugernavn!</p>" If Request.Form("pass")="" Then Response.Write "<p>Du skal skrive et password!</p>" Response.Write "<p><a href='java script:history.go(-1)' class='link'>Prøv igen</a></p>" %>
<% 'Hvis det indtastede i felterne opfylder kravene så If isNumeric(Request.Form("alder")) And Not Request.Form("karakter")="" And Not Request.Form("navn")="" And Not Request.Form("ingame")="" And Not Request.Form("pass")="" Then
'Kontrollerer om brugernavn findes i forvejen Set rs=Conn.Execute("SELECT [brugernavn] FROM [medlemmer] WHERE [brugernavn]='"&Request.Form("brugernavn")&"'") If rs.EOF Then
' Tilføj data i database strSQL = "Insert into Medlemmer (Navn, Ingame, Karakter, Altkarakter, Adresse, Postnummer, Town, Telefonnummer, Mailadresse, Alder, Brugernavn, Password) values('"&Request.Form("navn")&"', '"&Request.Form("ingame")&"', '"&Request.Form("karakter")&"', '"&Request.Form("altkarakter")&"', '"&Request.Form("adresse")&"', '"&Request.Form("postnr")&"', '"&Request.Form("by")&"', '"&Request.Form("telefon")&"','"&Request.Form("mail")&"','"&Request.Form("alder")&"','"&Request.Form("brugernavn")&"','"&Request.Form("pass")&"')"
' SQL sætning eksekveres Conn.Execute(strSQL)
'Hvis brugernavn findes i forvejen Else Response.Write "Dette brugernavn findes allerede!" End If
'Sender en til kvittering response.Redirect("tilmeld_kvittering.htm")
'Luk databaseforbindelse Conn.Close Set Conn = Nothing %>
Hov - nu fik jeg det til at fungere - læg et svar for at få point
Jeg flyttede kodestykket
'Hvis brugernavn findes i forvejen Else Response.Write "Dette brugernavn findes allerede!" End If
ned og indrammede med <% og %>
Koden ser nu sådan ud:
<% 'Validering af felterne alder og karakter 'Hvis feltet alder ikke indeholder et tal 'Hvis felterne navn ingame karakter og password er blanke If Not isNumeric(Request.Form("alder")) Then Response.Write "<p>Du skal vælge en alder!</p>" If Request.Form("navn")="" Then Response.Write "<p>Du skal skrive dit navn!</p>" If Request.Form("ingame")="" Then Response.Write "<p>Du skal skrive dit navn ingame. Hvis du ikke har et skriver du bare: Ingen!</p>" If Request.Form("karakter")="" Then Response.Write "<p>Du skal vælge en karakter. Hvis du ikke har valgt en karakter endnu, skal du vælge: Andet!</p>" If Request.Form("brugernavn")="" Then Response.Write "<p>Du skal skrive et brugernavn!</p>" If Request.Form("pass")="" Then Response.Write "<p>Du skal skrive et password!</p>" Response.Write "<p><a href='java script:history.go(-1)' class='link'>Prøv igen</a></p>" %>
<% 'Hvis det indtastede i felterne opfylder kravene så If isNumeric(Request.Form("alder")) And Not Request.Form("karakter")="" And Not Request.Form("navn")="" And Not Request.Form("ingame")="" And Not Request.Form("pass")="" Then
'Kontrollerer om brugernavn findes i forvejen Set rs=Conn.Execute("SELECT [brugernavn] FROM [medlemmer] WHERE [brugernavn]='"&Request.Form("brugernavn")&"'") If rs.EOF Then
' Tilføj data i database strSQL = "Insert into Medlemmer (Navn, Ingame, Karakter, Altkarakter, Adresse, Postnummer, Town, Telefonnummer, Mailadresse, Alder, Brugernavn, Password) values('"&Request.Form("navn")&"', '"&Request.Form("ingame")&"', '"&Request.Form("karakter")&"', '"&Request.Form("altkarakter")&"', '"&Request.Form("adresse")&"', '"&Request.Form("postnr")&"', '"&Request.Form("by")&"', '"&Request.Form("telefon")&"','"&Request.Form("mail")&"','"&Request.Form("alder")&"','"&Request.Form("brugernavn")&"','"&Request.Form("pass")&"')"
' SQL sætning eksekveres Conn.Execute(strSQL)
'Sender en til kvittering response.Redirect("tilmeld_kvittering.htm")
'Luk databaseforbindelse Conn.Close Set Conn = Nothing %>
<% 'Hvis brugernavn findes i forvejen Else Response.Write "Dette brugernavn findes allerede!" End If %>
PS men du skal nu alligevel have mange tak fennec - du kom jo med løsningen til at flytte den ene kode (også selv om det ikke helt fungerede før jeg lavede lidt om på det)
Selvom vi her taler et helt andet sprog/DB, så kunne det være, dette kunne inspirere: I PHP/MySQL har man mulighed for at undertrykke fejl ved DB-queries - og efterfølgende spørge på evt. fejl.
Gør man 'user' feltet unikt, og prøver at indsætte et navn, der allerede findes, vil MySQL returnere en fejl med nummeret 1062. Det kan udnyttes sådan:
$sql = "INSERT INTO `TABEL_NAVN` (..........) VALUES (..........)"; // Forespørgsel som streng @mysql_query($sql); // Udfør query, men undertryk fejlmeldinger med '@'
if (mysql_errno()==1062) { // Tjek for fejl. Hvis fejlen er 1062, eksisterer navnet i forvejen // Gør noget ... } else if (mysql_errno()==0) { // Indsættelsen lykkedes // Gør noget andet ... } else { // Der opstod en uforudset fejl // Gør noget tredie ... }
- squide godt OleBole ...! Det har fennec jo allerede været inde på for læææææænge siden! :o|
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.