Php 出生日期验证问题

Php 出生日期验证问题,php,validation,date,Php,Validation,Date,我编写了一些PHP验证代码来验证出生日期。代码应确保输入,(必填字段)格式为DD/MM/YYYY,年份必须介于2000年和2004年之间 我的代码存在的问题是,它正确地检查是否没有输入,并传递错误消息,但如果我输入任何随机字符,它会接受它,而不检查输入数据的格式或字符 这是我的密码: <?php if (isset($_POST['submit'])) { $msgd = ""; $dob = $_POST["dob"]; if(strlen($dob) > 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; ?>

出生日期

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

尝试更改:

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))
{
    return checkdate($d,$m,$y);
} else {
    $msgd = '<span class="error"><b>You must enter a correct date</b></span>';
}

出生日期


出生日期


我想我应该看看如何使用正则表达式来验证日期

$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
}
$pattern='#^(?(0[1-9])|([1-2][0-9])|(3[0-1])/(?(0[1-9])|(1[0-2])/(?200[0-4])#;
如果(1==预匹配($pattern,$dob,$matches)){
//日期有效
$day=$matches['day'];
$month=$matches['month'];
$year=$matches['year'];
}否则{
//日期无效
}

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

我想我只需要看看使用正则表达式来验证日期

$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
}
$pattern='#^(?(0[1-9])|([1-2][0-9])|(3[0-1])/(?(0[1-9])|(1[0-2])/(?200[0-4])#;
如果(1==预匹配($pattern,$dob,$matches)){
//日期有效
$day=$matches['day'];
$month=$matches['month'];
$year=$matches['year'];
}否则{
//日期无效
}


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

我在这里看到
返回
,但没有函数头。我想知道如果没有设置
$\u POST['submit']
,用户会看到什么。或者你可以省去很多麻烦,制作月、日、年下拉菜单。通过这种方式,您知道无论发生什么情况,值都是有效的,您只需验证是否为空。我在这里看到
return
,但没有函数头。我想知道如果没有设置
$\u POST['submit']
,用户会看到什么。或者你可以省去很多麻烦,制作月、日、年下拉菜单。通过这种方式,您知道无论发生什么情况,这些值都是有效的,并且您只需验证是否为空。刚才也尝试过这个方法,同样的问题是,它接受我输入的任何内容,甚至不显示文本“日期很好!”你能给我们一个用户输入日期的例子吗?另外,就在
if
条件之前,当你执行
var\u转储($\u POST)时输出什么如果您指的是正确的日期格式,那么它可能是2001年2月15日。我故意输入错误的数据,以确保它给我的错误“你必须输入一个正确的日期”只是随机的字母字符。我已经做了编辑,我已经把你所有的代码,并重写它应该如何工作。如果你想试一试,如果它不起作用,请评论:)刚才也试过了,同样的问题,它接受我输入的任何内容,甚至不显示文本“日期很好!”你能给我们一个用户输入日期的例子吗?另外,就在
if
条件之前,当你执行
var\u转储($\u POST)时输出什么如果您指的是正确的日期格式,那么它可能是2001年2月15日。我故意输入错误的数据,以确保它给我的错误“你必须输入一个正确的日期”只是随机的字母字符。我已经做了编辑,我已经把你所有的代码,并重写它应该如何工作。如果您想尝试一下,如果它不起作用,请评论:)啊,太好了,第二组代码工作得很好,非常感谢@弗朗西斯,请注意编辑。似乎我的一个编辑更改日期/月份的顺序最初并没有采用(我一开始的顺序是错误的)。这是最新的更新,它们的顺序是正确的。太好了,第二组代码工作得很好,非常感谢@弗朗西斯,请注意编辑。似乎我的一个编辑更改日期/月份的顺序最初并没有采用(我一开始的顺序是错误的)。此最新更新的顺序正确。