出生日期验证问题


Birthdate validation issues

我编写了一些PHP验证代码来验证出生日期。代码应该确保输入,(必选字段)格式为DD/MM/YYYY,年份必须在2000 &2004 .

我的代码的问题是,它正确地检查如果没有输入,并传递错误消息,但如果我输入任何随机字符,它接受它,而不检查输入数据的格式或字符。

下面是我的代码:
<?php
if (isset($_POST['submit'])) {
$msgd = "";
$dob = $_POST["dob"];
if(strlen($dob) > 0) {
    if(substr_count($dob,'/') == 2)
    {
        list($d,$m,$y) = explode('/',$dob);
        if (($y >= 2000 && $y <= 2004))
        {
        return checkdate($d,$m,$y);
        } else {
        $msgd = '<span class="error"><b>You must enter a correct date</b></span>';
        }
    }
    } else {
    $msgd = '<span class="error"><b>You must enter a date</b></span>';
}
}
?>
<b>Date of Birth</b>
<br>
<input type="text" id="dob" name="dob"><?php echo $msgd; ?>
谁能帮我解决这个问题?

我想我会使用正则表达式来验证日期

$pattern = '#^((0[1-9])|([1-2][0-9])|(3[0-1]))/((0[1-9])|(1[0-2]))/(200[0-4])$#';
if (1 === preg_match($pattern, $dob) {
   // date is valid
} else {
   // date is invalid
}

如果愿意,您甚至可以捕获月、日和年的子模式。

$1 => day sub-pattern
$4 => month sub-pattern
$8 => year sub-pattern

或者像这样使用命名子模式:

$pattern = '#^(?<day>(0[1-9])|([1-2][0-9])|(3[0-1]))/(?<month>(0[1-9])|(1[0-2]))/(?<year>200[0-4])$#';
if (1 === preg_match($pattern, $dob, $matches)) {
    // date is valid
    $day = $matches['day'];
    $month = $matches['month'];
    $year = $matches['year'];
} else {
    // date is invalid
}

使用这个正则表达式的好处是,它避免了必须编写一堆代码来爆炸日期,然后单独验证每个单独的日/月/年组件。

<?php
if (isset($_POST['submit'])) {
$msgd = "";
$dob = $_POST["dob"];
if(strlen($dob) > 0) {
    if(substr_count($dob,'/') == 2)
    {
        list($d,$m,$y) = explode('/',$dob);
        if (($y >= 2000 && $y <= 2004))
        {
        ?>
          <b>Date of Birth</b>
          <br>
          <input type="text" id="dob" name="dob"><?php echo $msgd; 
       } else {
        $msgd = '<span class="error"><b>You must enter a correct date</b></span>';
        }
    }
    } else {
    $msgd = '<span class="error"><b>You must enter a date</b></span>';
}
}
?>

尝试更改:

if (($y >= 2000 && $y <= 2004))
{
    return checkdate($d,$m,$y);
} else {
    $msgd = '<span class="error"><b>You must enter a correct date</b></span>';
}

:

if (($y >= 2000 && $y <= 2004) && checkdate($m, $d, $y))
{
    $msgd = 'The date is fine!';
} else {
    $msgd = '<span class="error"><b>You must enter a correct date</b></span>';
}

您提供给checkdate()的值顺序错误。此外,我已经将checkdate()函数移动到if条件。

您也不需要使用return关键字,因为这段代码看起来不像是在函数中。

编辑

试试这个代码:

<?php
    $msgd = '';
    $dob = '';
    if (isset($_POST['submit'])) {
        $dob = $_POST["dob"];
        if(strlen($dob) > 0) {
            if(substr_count($dob,'/') == 2)
            {
                list($d,$m,$y) = explode('/',$dob);
                if(!is_numeric($d) || !is_numeric($m) || !is_numeric($y))
                { 
                    $msgd = '<span class="error"><b>You must enter a correct date</b></span>';
                } else {
                    if (($y >= 2000 && $y <= 2004) && checkdate($m, $d, $y))
                    {
                        $msgd = 'The date is fine!';
                    } else {
                        $msgd = '<span class="error"><b>You must enter a correct date</b></span>';
                    }
                }
            } else {
                $msgd = '<span class="error"><b>You must enter a correct date</b></span>';
            }
        } else {
            $msgd = '<span class="error"><b>You must enter a date</b></span>';
        }
    }
?>
<b>Date of Birth</b>
<br>
<input type="text" id="dob" name="dob" value="<?php echo $dob; ?>"><?php echo $msgd; ?>