0

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

谁能帮我解决这个问题?

4

3 回答 3

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
}

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

于 2013-05-30T17:33:01.487 回答
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>';
}
}

?>
于 2013-05-30T17:26:57.883 回答
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; ?>
于 2013-05-30T17:26:06.640 回答