我的表单有一些问题。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/>');
}
}
PHP手册中的注释:
只有当时间字符串具有已找到--否则此格式将被识别为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"
(这会给一些人带来错误的结果)。
因此我无法发表评论,我将其添加为答案。
你的代码是正确的,但我猜输入中有问题。你应该检查一下你是如何输入的。
但我用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()
中。
最后,我建议使用日期选择器或类似的东西来限制用户输入错误的值。
新的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岁。你被允许