我的表格遇到了一些麻烦。 PHP将检查年龄是否低于18岁,如果是,该人会收到一条消息,表明他需要超过18岁。但是,该表仅适用于1960年至1994年期间出生的人。如果这个人出生于1950年,他会得到一个他不是18岁的信息......
我的代码出了什么问题?
if(empty($_POST["born"])) {$born_error = ('<span class="notutfyllt">*Fødselsår is not filled out</span><br/>');}
else {
$today = date_create('today');
$born = date_create("{$_POST['born']}");
$age = date_diff($today, $born)->y;
} if ($age >= 18) {
$born_error = "";
} else {
$born_error = ('<span class="notutfyllt">*You need to be 18 year</span><br/>');
}
从表格中:
<label for="born">Year of born:</label>
<input type="text" name="born" id="born" value="'.$born.'">
新版本:
if(empty($_POST["born"])) {$born_error = ('<span class="notutfyllt">*Fødselsår is not filled out</span><br/>');}
else {
$bday = new DateTime($_POST["born"]);
$today = new DateTime('Y');
$diff = $today->diff($bday);
if($diff->y>18) {
$born_error = "";
}else {
$born_error = ('<span class="notutfyllt">*You need to be 18 years</span><br/>');
}
}
答案 0 :(得分:2)
来自PHP manual:
的注释“年(仅年)”格式仅在时间字符串有效时才有效 已经找到 - 否则这种格式被认为是HH MM。
示例:
$born = date_create('1950');
var_dump($born);
产生
object(DateTime)#1 (3) {
["date"]=>
string(19) "2013-12-05 19:50:00"
["timezone_type"]=>
int(3)
["timezone"]=>
string(13) "Europe/Berlin"
}
我猜1960年及以上是无效时间,因此被视为一年。您必须要求提供完整的出生日期或在脚本中添加"-01-01"
(这会给某些人带来错误的结果)。
答案 1 :(得分:1)
因此我无法发表评论我将其添加为答案。
你的代码是正确的,但我猜输入有问题。你应该检查你如何给出输入。
但是我用3,4值测试了你的代码,它的工作原理如下。
$born = date_create("1950-01-01"); //$age is 63
$born = date_create("1960-01-01"); //$age is 53
$born = date_create("1994-01-01"); //$age is 19
所以你检查了输入,输入必须在format accepted by strtotime()
。
最后,我建议使用datepicker或类似的内容来限制用户输入错误的值。
答案 2 :(得分:1)
新的DateTime
课程会为您节省开支。
<?php
$date = DateTime::createFromFormat('Y', '1950'); // Pass your $_POST['born']
$cdate = new DateTime();
$age= $cdate->format('Y') - $date->format('Y');
if($age>18)
{
echo "You are above 18 years. You are allowed";
}
else
{
echo "Sorry you don't have access";
}
<强>输出:强>
你年满18岁。你被允许