Avatar billede gabi Novice
15. august 2007 - 01:24 Der 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

'Databaseforbindelse
set conn = server.createobject("ADODB.connection")
conn.Open "DBQ=" & server.mappath("../db/medlemmer.mdb") & ";Driver={Microsoft Access Driver (*.mdb)}"

' 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?
Avatar billede soerenlyn Nybegynder
15. august 2007 - 02:28 #1
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
Avatar billede fennec Nybegynder
15. august 2007 - 08:16 #2
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.
Avatar billede gabi Novice
15. august 2007 - 11:45 #3
>> Jeg ville helt klart også smide et "unike" på brugernavn feltet i databasen <<

Det er vel også det jeg har gjort når jeg har sat feltet til: Det er et tekstfelt med indekseret: Ja - ingen dubletter.

Er det ikke det du mener fennec?

Det andet kigger jeg på, når jeg er hjemme
Avatar billede fennec Nybegynder
15. august 2007 - 11:57 #4
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.
Avatar billede gabi Novice
15. august 2007 - 18:52 #5
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

'Databaseforbindelse
set conn = server.createobject("ADODB.connection")
conn.Open "DBQ=" & server.mappath("../db/medlemmer.mdb") & ";Driver={Microsoft Access Driver (*.mdb)}"

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")&"')"

Else
  Response.Write "Dette brugernavn findes allerede!"
End If

' SQL sætning eksekveres
Conn.Execute(strSQL)    = linie 46


'Sender en til kvittering
    response.Redirect("tilmeld_kvittering.htm")


'Luk databaseforbindelse
Conn.Close
Set Conn = Nothing
%>

<%
'Slut
End If
%>
Avatar billede gabi Novice
15. august 2007 - 23:02 #6
hmmm - jeg har fundet ud af at linie 46 i hvert tilfælde ikke bare skal slettes.
Avatar billede fennec Nybegynder
16. august 2007 - 08:19 #7
Nej, den skal flyttes:

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
Avatar billede gabi Novice
16. august 2007 - 09:44 #8
Hej fennec

Der har jeg ikke lige prøvet at flytte den hen, det prøver jeg i aften. Har ellers forsøgt en masse uden held.
Avatar billede gabi Novice
16. august 2007 - 17:48 #9
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

'Databaseforbindelse
set conn = server.createobject("ADODB.connection")
conn.Open "DBQ=" & server.mappath("../db/medlemmer.mdb") & ";Driver={Microsoft Access Driver (*.mdb)}"

'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
%>

<%
'Slut
End If
%>
Avatar billede gabi Novice
17. august 2007 - 00:40 #10
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

'Databaseforbindelse
set conn = server.createobject("ADODB.connection")
conn.Open "DBQ=" & server.mappath("../db/medlemmer.mdb") & ";Driver={Microsoft Access Driver (*.mdb)}"

'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
%>

<%
'Slut
End If
%>
Avatar billede gabi Novice
17. august 2007 - 00:43 #11
PS Hvad står EOF for? kan en af jer svar mig på det?
Avatar billede gabi Novice
17. august 2007 - 02:35 #12
Har fundet ud af hvad EOF står for - End Of File
Avatar billede fennec Nybegynder
17. august 2007 - 08:50 #13
Point må gå til soerenlyn. Det er hans/hendes løsning.

Vi har også en BOF. Det betyder "Beginning Of File" :o)
Avatar billede gabi Novice
17. august 2007 - 11:04 #14
ok fennec - så afventer jeg blot svar fra soerenlyn
Avatar billede gabi Novice
17. august 2007 - 11:05 #15
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)
Avatar billede soerenlyn Nybegynder
18. august 2007 - 14:18 #16
Okay - mange tak :) Jeg er en han, det kommer af navnet "soeren" :p
Avatar billede gabi Novice
18. august 2007 - 16:06 #17
Nok en gang 1.000 tak for den gode hjælp
Avatar billede olebole Juniormester
18. august 2007 - 16:17 #18
<ole>

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 ...
}

Herved spares et DB-kald  =)

/mvh
</bole>
Avatar billede olebole Juniormester
18. august 2007 - 16:22 #19
- squide godt OleBole ...! Det har fennec jo allerede været inde på for læææææænge siden!  :o|
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