出生日期验证问题

时间:2013-05-30 17:20:51

标签: php validation date

我编写了一些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; ?>

有人可以帮我解决这个问题吗?

3 个答案:

答案 0 :(得分:2)

我想我会看一下使用正则表达式验证日期

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

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

答案 1 :(得分:1)

<?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>';
}
}

?>

答案 2 :(得分:0)

尝试更改:

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; ?>