Avatar billede lsskaarup Nybegynder
22. februar 2010 - 15:50 Der er 8 kommentarer og
1 løsning

Endnu et dato valideringsspørgsmål

Jeg har arvet et system, hvor nogle datofelter tilpasses for at blive smidt i en MySQL database. Jeg har så opdaget, at den ikke er særligt glad for tomme felter, samt datoer der ikke eksistere f.eks. 32-02-2010.

Kan jeg i et hug validere for begge dele?

function fixDates($date) {

    if (ereg("([0-9]{1,2})([\.\-]{1})([0-9]{1,2})([\.\-]{1})([0-9]{1,4})", $date, $regs)) {
        if ($regs[5] < 100) $regs[5] += 2000;
        $out = $regs[5].'.'.$regs[3].'.'.$regs[1];
    } else {
        $out = date('Y-m-d');
    }
    return $out;
}
Avatar billede erikjacobsen Ekspert
22. februar 2010 - 16:44 #1
Avatar billede lsskaarup Nybegynder
23. februar 2010 - 13:17 #2
Det kan jeg selvfølgelig, men har fundet ud af at ereg() ikke opfører sig som den skal.

Jeg har 2 datofelter, som bliver behandlet nødagtig ens.

Det ene kan ereg() godt finde ud af at opslitte i 2-2-4, altså 2 cifre til dag og måned og 4 til år.

Det andet derimod, kommer kun ud med 2 cifre i årstallet, selvom de er helt ens indtastet. Der forstår jeg ikke, kan du give en forklaring på det?
Avatar billede erikjacobsen Ekspert
23. februar 2010 - 19:49 #3
Jeg er sikker på at ereg opfører sig som den skal ;)

Kan du vise hvad problemet er?
Avatar billede lsskaarup Nybegynder
24. februar 2010 - 10:16 #4
Jeg kan prøve, har ændret koden, så den på det problemfyldte felt ikke kalder funktionen. I stedet for tjekker jeg via javascript om datoen er gyldig, men jeg ville da gerne have denne til at virke, så jeg ikke kan have flere funktioner for at udføre det samme tjek.

Først koden.

    function fixDates($date) {
        if (ereg("([0-9]{1,2})([\.\-]{1})([0-9]{1,2})([\.\-]{1})([0-9]{1,4})", $date, $regs)) {

            if ($regs[5] < 100) $regs[5] += 2000;
            $out = $regs[5].'.'.$regs[3].'.'.$regs[1];
        } else {
            $out = date('Y-m-d');
        }
        ///echo $out;
        return $out;
    }

fixDates() får så en dato parameter fra to felter. I begge tilfælde har de dette format: dd-mm-åååå

Men kun i det første tilfælde bliver året returneret fra ereg() som 4-cifret, f.eks. 2010. I det andet tilfælde returner den kun 2 cifre, samtidig med at det er dagen og ikke årstallet.

Eks.:
Jeg indsætter echo $regs[5]; som det første der sker i if-sætningen.
Felt r2 indeholder 18-02-2010 -> ereg() returnerer 2010
Felt r4 indeholder 18-02-2010 -> ereg() returnerer 18

Så er det jeg undrer mig, hvorfor den kan finde ud af det første gang, men ikke anden gang. Skal parameteren nulstilles?
Avatar billede erikjacobsen Ekspert
24. februar 2010 - 14:01 #5
Det kan også undre mig - men er det så det rigtige der kommer ind i funcktionen? Du kan lave en lille test med en alert:

    function fixDates($date) {
        alert($date(;
        ......osv....
Avatar billede lsskaarup Nybegynder
24. februar 2010 - 14:21 #6
Ja, det glemte jeg at skrive, at jeg havde forsøgt. Hvis jeg bare alerter $date, med alert($date); får jeg de rigtige værdier nu.

Men jeg har da ikke prøvet på din måde, hvis det gør nogen forskel?
Avatar billede erikjacobsen Ekspert
24. februar 2010 - 14:34 #7
Hvis det er de rigtige værdier, der kommer med en alert, og du får de resultater du beskriver, så er der noget galt. Et eller andet sted.

Men det er mystisk som du beskriver det - der er noget du ubevidst må udelade :)
Avatar billede lsskaarup Nybegynder
24. februar 2010 - 14:40 #8
Ja, et eller andet går der da galt, og det gør det jo heller ikke nemmere at kodestumpen er noget jeg har arvet, og desværre ikke kan spørge udvikleren om ideen bagved.

Med det kan godt være jeg skal give fortabt, nu har jeg trods alt løst det via javascript i stedet for.
Avatar billede lsskaarup Nybegynder
08. marts 2010 - 11:49 #9
Må hellere lukke, selvom jeg aldrig reelt fandt fejlen. :-(
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