Php年龄检查表

Php年龄检查表,php,time,twig,Php,Time,Twig,我给出了我关于php的第一步,我得到了这个项目,虽然我知道正在做什么,但由于某些原因它不起作用 $app->post('/age/', function($lang) use($app) { $action = $app->request()->post('action'); $remember = $app->request->post('remember') === 'on'; if ($action ===

我给出了我关于php的第一步,我得到了这个项目,虽然我知道正在做什么,但由于某些原因它不起作用

$app->post('/age/', function($lang) use($app) {

        $action = $app->request()->post('action');
        $remember = $app->request->post('remember') === 'on';

        if ($action === 'Yes') {

            setcookie('AgeCheck', 'true', time()+60*60*24*30, '/'); //Expire in 1 month
            $_SESSION['age'] = 'true';

            $app->redirect(urldecode($app->request()->get('return')) ?: "/$lang");
        }
        else if ($action === 'Enter') {

            $limit = (60 * 60 * 24 * 365) * 18;

            $dob = $app->request->post('dob');

            if ($lang === 'us') {
                $dob = \DateTime::createFormFormat('mdy', $dob);
                $limit = (60 * 60 * 24 * 365) * 21;
            }
            else
            {
                $dob = \DateTime::createFromFormat('dmy', $dob);
            }

            if ((time() - $dob->getTimestamp()) >= $limit)
            {
                setcookie('AgeCheck', 1, (60*60*24*365)/12); //Expire in 1 month
                $_SESSION['age'] = 1;

                $app->redirect(urldecode($app->request()->get('return')) ?: "/$lang");
            }
        }

        $app->redirect("/$lang/underage");
理论上,如果用户通过了年龄限制,这应该将用户重定向到正确的页面,但它总是将用户重定向到未成年人页面

最明确的问题是:
if((time()-$dob->getTimestamp())>=$limit)


我做错了什么?

始终检查代码的每一行。 你的关键条件是:

if ((time() - $dob->getTimestamp()) >= $limit)
{
    setcookie('DrambuieAgeCheck', 1, (60*60*24*365)/12); //Expire in 1 month
    $_SESSION['age'] = 1;
    $app->redirect(urldecode($app->request()->get('return')) ?: "/$lang");
}
所以在此之前,只需echo/var_dump$dob->getTimestamp()和$limit。一切对你来说都很清楚。 如果$dob有问题,请检查$U POST['dob']返回的内容

例如:

var_dump($dob->getTimestamp());
var_dump($app->request->post('dob'));
var_dump($dob->getTimestamp());
var_dump(time());
echo 'condition result:';
var_dump(((time() - $dob->getTimestamp()));
if ((time() - $dob->getTimestamp()) >= $limit)

您将在条件中看到最重要的变量,条件本身解决了问题。一切都是正确的,但它甚至没有输入if,因为$action不是enter,而是submit。我仍然会保持@Daimos答案正确


这里更有趣的是((time()-$dob->getTimestamp())>=$limit)实际上是真的(在本文中)。那么,也许$action不是Enter安德鲁


这是解决这个问题的关键,在我尝试了所有的方法并检查它是否正确之后。

$dob=\DateTime::createFromFormat('dmy',$dob)未正确匹配<代码>dmy
不存在。在这种情况下,应该是
d-m-Y
。因此,
\DateTime::createFromFormat
将始终返回false。更不用说,
DateTime::craeateFromFormat
将返回一个由3个值组成的数组,而不是一个int。但是由于PHP如何处理类型,您没有意识到错误。这里更有趣的部分是,
((time()-$dob->getTimestamp())>=$limit)
实际上是
true
(在此上下文中)。所以可能
$action
不是
Enter
?正如我所说,我对php相当陌生,不知道如何呼出这些值,因为我正在提交表单。我检查它们的方法很简单,
$app->redirect(“/$lang/underage?dob=$dob?limit=$limit”)并在下面定义它们
$memory
。如果我创建像
$time=(time()-$dob->getTimestapm())
这样的东西,它总是给我一个错误或者什么也不显示(空白页)。检查我在if((time()-$dob->getTimestamp())>=$limit)条件之前添加的内容出于某种原因,我无法从var_dump中获取值,但我成功地做到了:
$dob=$app->request->post('dob');$dobDate=\DateTime::createFromFormat('mdy',$dob);$dobTime=$dobDate->getTimestamp();$limit=(60*60*24*365)*18;$time=time()$limitTime=$time-$limit;$dobTime2=$time-$dobTime;$result=$dobTime2>=$limit;
并使用
$app->redirect(“/$lang/underage?dob=$dob?dobtimstamp=$dobTime?dobTime2=$dobTime2?limit=$limitime?limitime=$limitime?result=$result”)将其打印在url上下一条评论的结果
未成年?dob=101080?dobTimestamp=340021257?dobTime2=1103587200?limit=567648000?limitime=875960457?Result=1
所以它似乎都在工作,因为它返回
true
后的结果是:…put:die();在echo之后,所以你肯定会看到变量