【问题标题】:Birthdate validation issues出生日期验证问题
【发布时间】:2013-05-30 17:20:50
【问题描述】:

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

谁能帮我解决这个问题?

【问题讨论】:

  • 我在这里看到return,但没有函数头。我想知道如果未设置 $_POST['submit'] 会向用户显示什么。
  • 或者您可以省去很多麻烦并制作月、日、年下拉菜单。这样你就知道这些值无论如何都是有效的,你只需要验证是否为空。

标签: php validation date


【解决方案1】:

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

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

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

【讨论】:

  • 啊,第二组代码运行良好,非常感谢!
  • @francis 请注意编辑。似乎我最初没有进行更改日/月顺序的编辑(起初我的顺序错误)。此最新更新的顺序正确。
【解决方案2】:
<?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>';
}
}

?>

【讨论】:

    【解决方案3】:

    尝试改变:

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

    【讨论】:

    • 刚才也试过了,同样的问题,它需要我输入的任何内容,甚至不显示文本“日期很好!”也有原因。
    • 你能给我们一个用户输入的示例日期吗?
    • 另外,就在if 条件之前,当您执行var_dump($_POST); 时会输出什么
    • 如果您的意思是正确的日期格式,而不是像 15/02/2001 这样的日期格式。我故意错误输入的数据以确保它给我的错误“您必须输入正确的日期”只是随机的字母字符。
    • 我已经进行了编辑,我已经获取了您的所有代码并将其重写为它应该如何工作。如果您想尝试一下,如果它不起作用,请发表评论:)
    猜你喜欢
    • 2021-08-13
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多