年龄检查通过并重定向

时间:2018-03-06 21:33:47

标签: php

我一直在尝试让它正常工作,但我在执行时获得了无限重定向。我过去做过这个,但是不记得我是怎么做到的(很久以前我就丢失了我原来的文件)。

我设置了一个年龄门,只允许18岁以上的人访问内容。如果他们来到我的首页(index.php),他们将被要求输入他们的生日(mm-dd-yyyy),如果他们符合年龄,他们将被带到下一页(home.php)。如果他们不是年龄,那么他们应该直接到“抱歉”页面(message.php)。并且,如果由于某种原因,他们直接进入home.php,他们需要被重定向到index.php才能进入他们的生日。

所以流程: index.php - home.php(如果他们通过年龄门)

指数。 php - message.php(如果他们不这样做)

home.php - index.php(如果他们尚未通过年龄门)

home.php - message.php(如果他们已经通过年龄门,但检查失败,并试图查看他们是否可以直接访问该页面)

(额外)file.php - index.php - file.php(如果他们没有通过年龄门,被重定向到索引这样做,然后在他们通过后被带回file.php /选中)

现在,我在home.php上获得了一个无限循环(重定向太多)

我的代码如下:

的index.php

<?php
session_start();

if ( isset( $_SESSION[ 'legal' ] ) ) { # Check to see if session has already been set
    $url = ( $_SESSION[ 'legal' ] == 'yes' ) ? 'home.php' : 'message.php';
    header( 'Location: ' . $url );
}

// If visitor hasn't gone through the age gate - Age Gate function and Set Session//
if ( isset( $_POST[ 'checkage' ] ) ) {
    $day = ctype_digit( $_POST[ 'day' ] ) ? $_POST[ 'day' ] : '';
    $month = ctype_digit( $_POST[ 'month' ] ) ? $_POST[ 'month' ] : '';
    $year = ctype_digit( $_POST[ 'year' ] ) ? $_POST[ 'year' ] : '';

    $birthstamp = mktime( 0, 0, 0, $month, $day, $year );
    $diff = time() - $birthstamp;
    $age_years = floor( $diff / 31556926 );
    if ( $age_years >= 18 ) {
        $_SESSION[ 'legal' ] = 'yes';

        $url = 'index.php';
    } else {
        $_SESSION[ 'legal' ] = 'no';

        // If failed the Age Gate go to specific page
        $url = 'message.php';
    }
    header( 'Location: ' . $url );
}


?>
<!doctype html>
<html>

<head>
    <meta charset="utf-8">
    <title>Check</title>
</head>

<body>
    <form method="post" action="index.php" id="checkage">
        <label for="Month">Month:</label>
        <input type="text" name="month" id="month"/>

        <label for="Day">Day:</label>
        <input type="text" name="day" id="day"/>

        <label for="Year">Year:</label>
        <input type="text" name="year" id="year"/>


        <input type="submit" name="checkage" value="Submit" class="submit-button"/>
    </form>
</body>

</html>

home.php

<?php
if (!isset($_SESSION['legal']) || $_SESSION['legal'] == 'no') {
    $_SESSION['target'] = $_SERVER['PHP_SELF'];
    header('Location: index.php');
    return;
}
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Home</title>
</head>

<body>
    <p>you are here</p>
</body>
</html>

message.php

<html>
<head>
<meta charset="utf-8">
<title>Sorry</title>
</head>

<body>
    <p>sorry you are not able to see this content</p>
</body>
</html>

不幸的是,我没有外部服务器来测试(或链接到)

1 个答案:

答案 0 :(得分:1)

我已经重写了很多你所拥有的内容,并将功能整合到一个check-age.php包含中。

// includes/check-age.php
<?php

session_start();

function isLegalAge() 
{
    return ! empty($_SESSION['is_legal']);
}

function hasCheckedLegalAge() 
{
    return isset($_SESSION['is_legal']);
}

function validateLegalAge() 
{
    $day = $_POST['day'] ?? null;
    $month = $_POST['month'] ?? null;
    $year = $_POST['year'] ?? null;

    $dob = new DateTime("{$year}-{$month}-{$day}");
    $age = $dob->diff(new DateTime);

    $_SESSION['is_legal'] = $age->y >= 18;

    redirect();
}

function redirect() 
{
    $validUrl = $_SESSION['redirect_url'] ?? 'home.php';
    $url = isLegalAge() ? $validUrl : 'message.php';

    unset($_SESSION['redirect_url']);

    header("Location: {$url}");
    exit();
}

function forceLegalAgeCheck($redirectUrl = null) 
{
    $_SESSION['redirect_url'] = $redirectUrl;

    header('Location: index.php');
    exit();
}

如果您将check-age.php文件包含在其他文件(home.phpfile.php)的顶部,则可以将逻辑简化为以下内容。

// index.php
<?php

require_once('includes/check-age.php');

// Redirect user if they have already confirmed age
if (hasCheckedLegalAge()) redirect();

// Validate user submitted age and redirect accordingly
if ($_POST) validateLegalAge();

// HTML ...


// home.php
<?php

require_once('includes/check-age.php');

// Check if user is of legal age, or force legal age check and return to this page
if (! isLegalAge()) forceLegalAgeCheck();

// HTML ...


// file.php
<?php

require_once('includes/check-age.php');

// Check if user is of legal age, or force legal age check and return to this page
if (! isLegalAge()) forceLegalAgeCheck(__FILE__);

// HTML ...

这是未经测试的,但我认为它应该有效,或者至少可以让您知道如何继续。

编辑 - 我做了一些修改以满足您的新要求。

  1. 创建了hasCheckedLegalAge()函数。
  2. isLegalAge()替换了index.php中的hasCheckedLegalAge()来电。
  3. 我认为这应该达到你所需要的,但如果没有,它肯定会让你再次指向正确的方向。