Avatar billede gertnissen Nybegynder
12. december 2004 - 00:37 Der er 8 kommentarer og
1 løsning

Korrekt dato / dato validering - ASP/MySQL

Jeg har et html-form-inputfelt med plads til 10 char. I dette felt skriver man en dato, men da brugeren kan anvende disse 10 char yderst kreativt kan de finde på at angive datoen på mange forskellige formater "2004-12-11", "11-12-2004", "20041211" osv osv.

Yderligere skal datoen gemmes/hentes i et MySQL felt af typen Date, dvs MySQL vil have værdien "2004-12-11" for a kunne omdanne til en SQL date.

Er der en sikker måde at teste og omforme brugerens input, så datoen altid læses korrekt (uanset input format) ?
Avatar billede pfp Nybegynder
12. december 2004 - 00:53 #1
Var det ikke smartere at lave datovalget som tre select-bokse. En til hver: dag, måned, år?
Avatar billede gertnissen Nybegynder
12. december 2004 - 00:54 #2
jo, men nu er udfordringen en lidt anden jvf. spørgsmålet.

Er den en sikker måde at lave dato validering på ved 'ukendte' formater ?
Avatar billede pfp Nybegynder
12. december 2004 - 02:34 #3
Ja det er jeg klar over, men det kunne jo være det andet ikke have strejfet dig.

Du kan jo lave et regexp, javascript for direkte validering eller asp hvor den submitter  og først derefter svarer om det er valid.
Avatar billede erikjacobsen Ekspert
12. december 2004 - 07:48 #4
Regulære udtryk er godt. Men der er et problem mellem dansk og udansk skrivemåde.
Betyder "11-12-2004" nu 11. december eller 12. november? Hvis du kan bestemme dig
for det, kan det nok grejes ;)
Avatar billede erikjacobsen Ekspert
12. december 2004 - 08:20 #5
Du kan jo lege lidt med dette eksempel. Det kunne nok laves en anelse smarter,
men regulære udtryk i stenalder-ASP er ret kluntede, desværre.

<%

  function two(s)
    if len(s)=1 then
      two="0" & s
    else
      two=s
    end if
  end function

  function datotjek(dato)
    dim regex,matches,match
    set regex = new regexp
    regex.pattern = "^ *([0-9]{4})-([0-9]{1,2})-([0-9]{1,2}) *$"
    regex.global = false
    regex.ignorecase = false

    set matches = regex.execute(dato)

    if matches.count>0 then
      set match=matches(0)
      datotjek=match.submatches(0) & "-" & two(match.submatches(1)) & "-" & two(match.submatches(2))
      set matches=nothing
      exit function
    end if
    set matches=nothing

    regex.pattern = "^ *([0-9]{4})([0-9]{2})([0-9]{2}) *$"

    set matches = regex.execute(dato)

    if matches.count>0 then
      set match=matches(0)
      datotjek=match.submatches(0) & "-" & two(match.submatches(1)) & "-" & two(match.submatches(2))
      set matches=nothing
      exit function
    end if
    set matches=nothing

    regex.pattern = "^ *([0-9]{1,2})-?([0-9]{1,2})-([0-9]{4}) *$"

    set matches = regex.execute(dato)

    if matches.count>0 then
      set match=matches(0)
      datotjek=match.submatches(2) & "-" & two(match.submatches(1)) & "-" & two(match.submatches(0))
      set matches=nothing
      exit function
    end if
    set matches=nothing

    datotjek="FEJL"
  end function
 
  response.write datotjek("2004-06-01") & "<br>"
  response.write datotjek("  2004-6-1  ") & "<br>"
  response.write datotjek("  20040601  ") & "<br>"
  response.write datotjek("  1-6-2004  ") & "<br>"
  response.write datotjek("  øllebrød  ") & "<br>"

%>
Avatar billede erikjacobsen Ekspert
12. december 2004 - 08:21 #6
Ups, den sidste skal ikke være
  regex.pattern = "^ *([0-9]{1,2})-?([0-9]{1,2})-([0-9]{4}) *$"
men
  regex.pattern = "^ *([0-9]{1,2})-([0-9]{1,2})-([0-9]{4}) *$"
Avatar billede gertnissen Nybegynder
13. december 2004 - 23:30 #7
Perfekt regexp.pattern var jo det jeg skulle bruge. (match.submatches er også smart.)

Jeg har udvidet scripet lidt så jeg også kan modtage årstal med kun 2 cifre.

Tak for hjælpen <erikjacobsen>, smider du et svar.

PS: Kender du en tutorial/artikel til dette emne ?
Avatar billede erikjacobsen Ekspert
14. december 2004 - 09:04 #8
Jeg kender ikke noget rigtig godt online. Men der er skrevet bøger om det
som er gode. Søg selv ;)  Men der er fx den her:
http://www.whsmith.co.uk/WHS/Go.asp?isbn=1861007302&DB=220
(jeg kender den ikke)

Jeg samler ikke på point, tak.
Avatar billede gertnissen Nybegynder
16. december 2004 - 23:12 #9
Nu lukker jeg ved at tage dem tilbage.

Tak for hjælpen.
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