Avatar billede newbie.dk Praktikant
12. marts 2004 - 17:12 Der er 27 kommentarer og
2 løsninger

Formular validering

Hej.
Vidste ikke lige hvilken kategori der ville være bedst og nemmest til dette spørgsmål. Prøver her.

Nå men jeg har en formular, som sender data til en database.
I denne formular vil jeg gerne validere hvert felt inden data bliver sendt videre til database. Nu får jeg fejl hvis datatypen ikke passer.
Min formular ser ud ala dette:

<FORM action="bla.asp" method=post>
<INPUT name=nr value="nr">
<INPUT name=fornavn value="fornavn">
<INPUT name=efternavn value="efternavn">
<INPUT name=email value="email"><br>
<INPUT type="text" name=tal1 maxlength="3" size="10" value="tal">
<INPUT type="text" name=tal2 maxlength="3" size="10" value="tal">
<br>
<INPUT type="radio" name="ko" value="1"><br>
<INPUT type="radio" name="ko" value="2"><br>
<INPUT type="submit" value="Send" id=submit1 name=submit1>
<INPUT type="reset" value="Slet alt" id=reset1 name=reset1>
</FORM>

Her hvordan jeg godt kunne tænke mig felterne blev valideret:

nr: kun tal(heltal)
Fornavn: kun tekst(ikke tal og tegn, ved ikke om bindestreg skal med)
Efternavn: kun tekst(ikke tal og tegn)
Email: skal indeholde @(og måske andre kriterier, ved ikke lige hva)
Tal1: kun tal(heltal) max 3, og ikke over en værdi på 500
Tal2: kun tal(heltal) max 3, og ikke over en værdi på 500 og ikke under en værdi på 80

Så havde jeg tænkt at hvis ét eller flere felter ikke var udfyldt konrekt, ville man få at vide at du kun må bruge f.eks tal i Tal1-feltet og husk evt. @ ved email-feltet. De andre data i formular vil stadig stå der.

Jeg ved ikke om dette kan lade sig gøre, men synes jeg har set noget ala dette andre steder.

Håber det er til at forstå.
Avatar billede eagleeye Praktikant
12. marts 2004 - 17:21 #1
Eks på hvordan det kan laves med java script:


<html>
<body>

<script language="javascript">
function validform(theform) {
var ok_data = true;
var filter = /^\d+(1,})?$/;
if (filter.test(theform.nr.value) == false) {
  alert("nr skal være et tal");
  ok_data = false;
}
var filter = /^([a-zæøå]){1,}$/;
if (filter.test(theform.fornavn.value) == false) {
  alert("fornavn skal udfyldes.");
  ok_data = false;
}
if (filter.test(theform.efternavn.value) == false) {
  alert("efternavn skal udfyldes.");
  ok_data = false;
}
if(!theform.email.value.match(/^[\w]{1}[\w\.\-_]*@[\w]{1}[\w\-_\.]*\.[\w]{2,6}$/i)) {
  alert("email adresse skal være gyldig");
  ok_data = false;
}
var filter = /^\d+(1,3})?$/;
if (filter.test(theform.tal1.value) == false || theform.tal1.value > 500 || theform.tal1.value < 0) {
  alert("tal1 skal være mindre 500");
  ok_data = false;
}
var filter = /^\d+(2,3})?$/;
if (filter.test(theform.tal2.value) == false || theform.tal2.value > 500 || theform.tal2.value < 80) {
  alert("tal2 skal være imellem 80 og 500");
  ok_data = false;
}

return ok_data; 
}
</script>

<FORM action="bla.asp" method="post" onsubmit="return validform(this);">
<INPUT name=nr value="nr">
<INPUT name=fornavn value="fornavn">
<INPUT name=efternavn value="efternavn">
<INPUT name=email value="email"><br>
<INPUT type="text" name=tal1 maxlength="3" size="10" value="tal">
<INPUT type="text" name=tal2 maxlength="3" size="10" value="tal">
<br>
<INPUT type="radio" name="ko" value="1"><br>
<INPUT type="radio" name="ko" value="2"><br>
<INPUT type="submit" value="Send" id=submit1 name=submit1>
<INPUT type="reset" value="Slet alt" id=reset1 name=reset1>
</FORM>

</body>
</html>
Avatar billede thesurfer Nybegynder
12. marts 2004 - 18:28 #2
JavaScript er klientside, dvs det vises i browseren.. og det der vises i browseren, kan downloades og ændres. Så man kan faktisk komme udenom din validering, hvis man downloader din form.

Det sikreste ville være, at lave den via ASP (serverside) :)
Ja, det bliver lidt tungere på serveren, da den så skal lave mere.. men det er det sikreste.. og du kan også tilføje noget "referrer"-kode, så du kan se om brugeren kommer fra din side.
Avatar billede newbie.dk Praktikant
13. marts 2004 - 01:48 #3
thesurfer, det er sikkert en god ide du nævner, men i mit tilfælde gør det ikke så meget. Hvis det skulle ske ville det kun gå ud over brugeren selv.

eagleeye, jeg har ikke lige nået at kigge så meget på det endnu, og hellere ikke testet det. Men hvad jeg lige kunne se ser det rigtigt fint ud(uden at kende det helt store til JS) men tror du har det hele med. Men for mig ser det lidt vildt ud :)

Jeg ved ikke om det kan gøres kort, men kan det forklares hvad de forskellige ting gør? (hvis, kan du få lidt ekstra point for det) bare så jeg måske har mulighed for at tilføje eller fjerne ting.
F.eks ved:
nr: var filter = /^\d+(1,})?$/;
Fornavn: var filter = /^([a-zæøå]){1,}$/;
email: (/^[\w]{1}[\w\.\-_]*@[\w]{1}[\w\-_\.]*\.[\w]{2,6}$/i))
tal1: var filter = /^\d+(1,3})?$/;

I din kode er der der taget højde for hvis nogle at felterne ikke bliver udfyldt? At den så f.eks skriver "Husk at skrive fornavn" Ellers vil jeg gerne give flere point for det.
Avatar billede roenving Novice
13. marts 2004 - 02:21 #4
Der er brugt reguular expressions, som er et selvstændigt kodesprog, som kan bruges (næsten !-) ens i en hel del forskellige programmeringssprog ...

Den første er nok en tavetosse, for dette bør du (i nr):

var filter = /^\d+$/;

-- betydningen er: hele teksten skal bestå af et eller flere tal og forklaringen er:

// er regExp-afgrænsere, ligesom du bruger gåseøjne eller apostroffer i tekststrenge !-)

^$ betyder henholdsvis helt fra start af og helt til slut

\d betyder et tal (0-9)

+ betyder et eller flere af tegnet foran

{1,} er en anden måde at skrive et eller flere på

Fornavn: var filter = /^([a-zæøå]){1,}$/;

-- og tilføjelserne her betyder:

() lav en gruppe (som kan bruges i en evt. udskiftning, unødvendig lige her !-)

[] et hvilket som helst tegn herinde vil være i orden

a-z betyder et af tegnene imellem a og z

[a-zæøå] betyder derfor et hvilketsomhelst lille bogstav vil du

-- jeg ville nok bruge:

Fornavn: var filter = /^[a-zæøå]+$/i;

-- hvor i'et betyder case Insensitive, dvs. både store og små bogstaver dur, og ellers betyder det det samme ...

email: (/^[\w]{1}[\w\.\-_]*@[\w]{1}[\w\-_\.]*\.[\w]{2,6}$/i))

-- jeg ville nok:
email: (/^\w[\w\.\-_]*@\w[\w\-_\.]*\.\w{2,6}$/i))

-- og tilføjelserne til de ovennævnte koder:

\w betyder et word-tegn, som er et bogstav, et tal eller _ -- afhængig af brugerens landeopsætning kan det betyde specialkarakterer også (æøå, é ö osv.)

\. betyder et punktum, og det er nødvendigt, da . alene betyder et hvilkensomhelst tegn !-)

\- er brugt for at være sikker på, at der ikke kan forveksles med den omtalt ovenfor (a-z)

{2,6} betyder mindst 2 og højest 6 af det forudgående tegn (her \w altså mindst to og højest 6 ord-tegn !-)
Avatar billede newbie.dk Praktikant
14. marts 2004 - 12:57 #5
Det virker fint. Der er lige et par ting jeg godt kunne tænke mig.

1. at der vurderes om alle felterne er tomme, eller om værdien er forkert.
  F.eks hvis NR er tomt, skrives der "du mangler at udfylde nr"
  Hvis man er kommet til at skrive bogstaver, skrives der: "Nr skal være tal"
2. at alle alert-erne bliver samlet til én alert-box, som f.eks her:
  http://privat.tdc.dk/internet/bredbaand/bestil/
3. jeg havde lige glemt at det ville være godt at validere om folk havde checket en
  af to radio-knapper. 1 eller 2. Og der skal stå: husk at angive blabla.
4. ved valideringen af f.eks TAL2, skriver den uanset om værdien er for høj eller
  lav det samme. Kan man lave så den fortæller hvor fejlen ligger.

Jeg er rigtigt glad for det der er lavet endtil videre.
Og roenving der kommer lige nogle point i din retning.

Jeg ved ikke hvad den samlet point-sum skal komme op på. Men jeg havde jo et spørgsmål til 100 point. Efterfølgende er der kommet en hel del på. Hvad synes I selv disse ting skal udgøre i point.
Avatar billede newbie.dk Praktikant
14. marts 2004 - 13:01 #6
Kan man skrive med anden tekst-type i en alert-box? F.eks fed?
Avatar billede eagleeye Praktikant
14. marts 2004 - 13:09 #7
1. Jo det kan man
2. Jo det kan man
3. Man kunne sætte den ene som default, så behøves validering ikke
4. Nej, men den skriver imellem 80 og 500, så det jo relativt nemt selv at gemmenskue hvor fejlen er :) men det kan også laves.

Angående font tror jeg faktisk ikke man kan ændre på det eller sætte fed ind.

Jeg vil godt lave det men der går lige ½-1 time inden jeg får tid til det.
Avatar billede newbie.dk Praktikant
14. marts 2004 - 14:09 #8
Lyder fint, venter spændt.
Avatar billede eagleeye Praktikant
14. marts 2004 - 14:17 #9
ok der gik lidt mere :)
Her med 1,2,3,4 så vidt jeg lige kan se.


<html>
<body>

<script language="javascript">
function validform(theform) {
var ok_data = true;
var tekst='';

if (theform.nr.value == '') {
  tekst += 'nr må ikke være tom\n';
  ok_data = false;
} else { 
  var filter = /^\d+(1,})?$/;
  if (filter.test(theform.nr.value) == false) {
    tekst += 'nr skal være et tal\n';
    ok_data = false;
  }
}
var filter = /^([a-zæøå]){1,}$/;
if (theform.fornavn.value == '') {
  tekst += 'Fornavn skal udfyldes\n';
  ok_data = false;
} else { 
  if (filter.test(theform.fornavn.value) == false) {
    tekst += 'Fornavn må kun indeholder bogstaver\n';
    ok_data = false;
  }
}
if (theform.efternavn.value == '') {
  tekst += 'Efternavn skal udfyldes\n';
  ok_data = false;
} else { 
  if (filter.test(theform.efternavn.value) == false) {
    tekst += 'efternavn skal udfyldes\n';
    ok_data = false;
  }
}
if (theform.email.value == '') {
  tekst += 'E-mail skal udfyldes\n';
  ok_data = false;
} else { 
  if(!theform.email.value.match(/^[\w]{1}[\w\.\-_]*@[\w]{1}[\w\-_\.]*\.[\w]{2,6}$/i)) {
    tekst += 'E-mail adresse skal være gyldig\n';
    ok_data = false;
  }
}
if (theform.tal1.value == '') {
  tekst += 'tal1 skal udfyldes\n';
  ok_data = false;
} else {
  if (theform.tal1.value > 500) {
    tekst += 'tal1 skal være mindre end 500\n';
  }
  if (theform.tal1.value < 0) {
    tekst += 'tal1 skal være større end 0\n';
  }
  var filter = /^\d+(1,3})?$/;
  if (filter.test(theform.tal1.value) == false) {
    tekst += 'tal1 må kun indeholde tal\n';
    ok_data = false;
  }
}
if (theform.tal2.value == '') {
  tekst += 'tal2 skal udfyldes\n';
  ok_data = false;
} else {
  if (theform.tal2.value > 500) {
    tekst += 'tal2 skal være mindre end 500\n';
  }
  if (theform.tal2.value < 0) {
    tekst += 'tal2 skal være større end 80\n';
  }
  var filter = /^\d+(2,3})?$/;
  if (filter.test(theform.tal2.value) == false) {
    tekst += 'tal2 må kun indeholde tal\n';
    ok_data = false;
  }
}
if(!theform.ko[0].checked && !theform.ko[1].checked) {
  tekst += 'ko skal vælges, blabla\n';
  ok_data = false;
}
if (ok_data==false) {
  alert(tekst);
}
return ok_data; 
}
</script>

<FORM action="bla.asp" method="post" onsubmit="return validform(this);">
<INPUT name=nr value="nr">
<INPUT name=fornavn value="fornavn">
<INPUT name=efternavn value="efternavn">
<INPUT name=email value="email"><br>
<INPUT type="text" name=tal1 maxlength="3" size="10" value="tal">
<INPUT type="text" name=tal2 maxlength="3" size="10" value="tal">
<br>
<INPUT type="radio" name="ko" value="1"><br>
<INPUT type="radio" name="ko" value="2"><br>
<INPUT type="submit" value="Send" id=submit1 name=submit1>
<INPUT type="reset" value="Slet alt" id=reset1 name=reset1>
</FORM>

</body>
</html>
Avatar billede roenving Novice
14. marts 2004 - 14:26 #10
>>eagleeye

Kig lige dine regexps igennem, f.eks. med udgangspunkt i min kommentar ...

I hvert fald denne ser _meget_ underlig ud ...

  var filter = /^\d+(1,})?$/;

-- jeg har svært ved at forstå slutningen: (1,})?

-- sikkert en tavetosse -- og så er det dobbeltkonfekt !-)

  var filter = /^\d+$/;
Avatar billede roenving Novice
14. marts 2004 - 14:29 #11
-- og så må der åbenbart ikke skrives store bogstaver i navnene ?-)

-- og en gentagelse af den ovenstående tavetosse i tal1 og tal2:

  var filter = /^\d+(1,3})?$/;
  var filter = /^\d+(2,3})?$/;
Avatar billede newbie.dk Praktikant
15. marts 2004 - 16:37 #12
Okay, det virker jo ellers fint.
Men det er rigtig at man ikke kunne bruge store bogstaver i navnene. Det er retttet nu.
Jeg er ikke helt med på hvad du mener med (1,})?  har ikke prøvet at slette det.
Kan du ikke skrive hele linien jeg skal rette, kan ikke lige se mig ud af det.
Avatar billede roenving Novice
15. marts 2004 - 17:22 #13
Prøv at se det første punkt @ 13/03-2004 02:21:42 !-)
Avatar billede newbie.dk Praktikant
18. marts 2004 - 10:09 #14
Okay jeg synes det køre fint. Har ikke rettet det sidste.
Ved i om man kan indsætte tomme/blanke linier i en arlert-box?
Men kan I ikke ligge et svar så vi kan få delt nogle point ud.

Har I kigget på denne:
http://www.eksperten.dk/spm/478679
Jeg ved ikke om det kan lade sig gøre. Men det kan I sikkert svare på.
Avatar billede eagleeye Praktikant
18. marts 2004 - 17:34 #15
\n giver en ny linje så bliver linje tom. Så du kan sættte flere ind:

tekst += 'tal2 må kun indeholde tal\n\n';
Avatar billede eagleeye Praktikant
22. marts 2004 - 19:28 #16
Jo ligget et svar :)
Avatar billede newbie.dk Praktikant
25. marts 2004 - 00:59 #17
Takker, det fortjener du.
Roenving vil du ikke lige have et par point?
Avatar billede roenving Novice
25. marts 2004 - 01:02 #18
Oki '-)
Avatar billede newbie.dk Praktikant
25. marts 2004 - 09:25 #19
Mange tak for hjælpen begge to.
Håber i er tilfredse med pointne.
Avatar billede roenving Novice
25. marts 2004 - 14:20 #20
-- jamen, tak for points da ;~}
Avatar billede newbie.dk Praktikant
25. marts 2004 - 22:46 #21
Damn. Nogle gange går det galt og den tjekker ikke tallene for større eller mindre end.
Avatar billede roenving Novice
26. marts 2004 - 15:06 #22
Prøv med:

  if (+theform.tal2.value > 500) {
    tekst += 'tal2 skal være mindre end 500\n';
  }
  if (+theform.tal2.value < 0) {
    tekst += 'tal2 skal være større end 80\n';
Avatar billede newbie.dk Praktikant
29. marts 2004 - 15:44 #23
Det virker ikke.
Hvis et af felterne ikke er udfyldt og det andet felt har en for lav/høj værdi, kommer beskeden godt nok. Men hvis begge felter er udfyldt forkert med for lav/høj værdi, accepteres værdierne og man sendes videre.
Avatar billede roenving Novice
29. marts 2004 - 15:48 #24
Stopklodsen mangler også, så sådan:

if (theform.tal2.value == '') {
  tekst += 'tal2 skal udfyldes\n';
  ok_data = false;
} else {
  if (+theform.tal2.value > 500) {
    tekst += 'tal2 skal være mindre end 500\n';
  ok_data = false;
  }
  if (+theform.tal2.value < 80) {
    tekst += 'tal2 skal være større end 80\n';
  ok_data = false;
  }
  var filter = /^\d+(2,3})?$/;
  if (filter.test(theform.tal2.value) == false) {
    tekst += 'tal2 må kun indeholde tal\n';
    ok_data = false;
  }
}
Avatar billede newbie.dk Praktikant
29. marts 2004 - 16:16 #25
Perfekt.
Du satte et +(plus) før, hvad gør det?
For mig at se virker det på samme måde som uden, eller?
Avatar billede roenving Novice
29. marts 2004 - 16:27 #26
Plusset typecaster værdien til en tal-værdi, for at være sikker på, at den ikke begynder at sammenligne tekststrenge, da '9' > '800', men 9 < 800 ...
Avatar billede newbie.dk Praktikant
10. maj 2004 - 16:14 #27
Der er gået noget galt her.
Kan i ligger et svar igen.
Avatar billede roenving Novice
10. maj 2004 - 16:37 #28
Hrm, jeg kan da godt huske den, men det er jo lidt lang tid siden ...

-- velbekomme '-)
Avatar billede eagleeye Praktikant
10. maj 2004 - 21:46 #29
Ja ok her et svar :)
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
Vi tilbyder markedets bedste kurser inden for webudvikling

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