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