Код Age Verify выгоняет людей из старости?

мой код пропускает людей, если их больше 19, но также и если ваш старый, он не позволяет вам войти, почему это? Сегодня у меня был человек, который пытался войти на мой сайт с 1958 года, и его выгнали, но я могу войти с 1989 года, и он отлично работает.

индексная страница

<!doctype html>
<!--[if lt IE 7]>      <html class="no-js lt-ie9 lt-ie8 lt-ie7" lang=""> <![endif]-->
<!--[if IE 7]>         <html class="no-js lt-ie9 lt-ie8" lang=""> <![endif]-->
<!--[if IE 8]>         <html class="no-js lt-ie9" lang=""> <![endif]-->
<!--[if gt IE 8]><!-->
<html class="no-js" lang="">
<!--<![endif]-->

<head>
<meta charset="utf-8">
<meta name="description" content="">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>510 Vapour</title>
<link rel="stylesheet" href="css/bootstrap.min.css">
<link rel="stylesheet" href="css/main.css">
<link rel="stylesheet" href="css/responsive.css">
<link rel="stylesheet" href="css/animate.min.css">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css">
</head>
<div class="js">
<body>
  <!-- Preloader section -->
<div id="preloader"></div>
 <!-- Preloader section -->
<div class="container"> 
  <!-- AccessBox section -->
  <div id="accessbox"class="animated bounceInDown"> <img class="profile-img" src="images/logo.png" />
    <h2 class="text-center">Please enter your date of birth</h2>
    <!-- Form section-->
    <form action="php/access.php" method="post" class="access-form">
      <input type="text" name="yy" class="access-input-lg" placeholder="2016" required autofocus>
      <input type="text" name="mm" class="access-input" placeholder="05">
      <input type="text" name="dd" class="access-input" placeholder="10">
      <input type="submit" name="submit"class="access-btn" value="OK" >
      <div id="remember" class="checkbox text-center">
        <label class="text-center">
          <input type="checkbox" value="remember-me">
          Remember me </label>
      </div>
    </form>
    <!-- Form section-->
    <h1 class="text-center"><i class="fa fa-exclamation-triangle red"></i> You must be 19+ to enter this site </h1>
    <p class="text-center">By ENTERING, you are consenting to your Province's Smoking Laws. You may be required to show a valid government issued Photo ID indicating your date of birth at time of delivery or at the Post Office.</p>
  </div>
  <!-- AccessBox section --> 
</div>
<!-- /container --> 
<!-- JS files--> 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script> 
<script src="js/bootstrap.min.js"></script> 
<!-- Pre Loader--> 
<script type="text/javascript">
jQuery(document).ready(function($) {  

$(window).load(function(){
    $('#preloader').fadeOut('slow',function(){$(this).remove();});
});

});
</script>
</body>
</div>
</html>

доступ.php

<?php

    $minAge = 19;

    if(isset($_POST['submit'])){

        if(strlen($_POST['mm'])==1)
        $month = '0'.$_POST['mm'];
        else 
        $month = $_POST['mm'];
        $agevar = $_POST['yy'];

      $age = strtotime($agevar);

      $nineteen = strtotime("-" . $minAge . " years");

      if($age && $nineteen && $age <= $nineteen){

         header('Location: https://www.510vapour.com/main');

      }

      else{

        header('Location: ../error.html');

      }

    }

    ?>

person jigga_jones    schedule 25.04.2016    source источник
comment
Используйте фигурные скобки для всех управляющих блоков, и у вас будет намного меньше подобных ошибок. Кроме того, не используйте strtotime для математики даты. Он не предназначен для этого.   -  person John Conde    schedule 26.04.2016
comment
Почему бы вам не проверить день? пользователь мог родиться в последний день месяца, и технически ему все еще 18 лет.   -  person Pedro Lobito    schedule 26.04.2016
comment
лол, извините, я новичок в php, поэтому я не понимаю, о чем вы говорите, не могли бы вы помочь, пожалуйста   -  person jigga_jones    schedule 26.04.2016
comment
заполнитель для ввода года показывает 4 цифры (2016), но ваш пост получает только 2 $agevar = $_POST['yy'];   -  person Pedro Lobito    schedule 26.04.2016


Ответы (2)


Вы можете использовать DateTime объекты, чтобы рассчитать точный возраст человека и выбрать соответствующее действие на основе этого.

Использование формата year-month-day при построении объекта должно работать независимо от количества цифр, предоставленных для года, месяца или дня.

$birthdate = new DateTime($_POST['yy'].'-'.$_POST['mm'].'-'.$_POST['dd']);
$now = new DateTime;
$age = $birthdate->diff($now);

if ($age->y >= $minAge){
    header('Location: https://www.510vapour.com/main');
} else {
    header('Location: ../error.html');
}
person Don't Panic    schedule 25.04.2016
comment
извините, я новичок в php, так куда пойдет этот фрагмент кода? - person jigga_jones; 26.04.2016
comment
Это может заменить все внутри блока if (isset($_POST['submit'])) {. - person Don't Panic; 26.04.2016
comment
Однако это минимальный пример. Вам все равно нужно будет делать такие вещи, как убедиться, что необходимые переменные $_POST действительно установлены в допустимые значения и обрабатывать ошибки, если они не являются. - person Don't Panic; 26.04.2016
comment
‹?php $minAge = 19; if(isset($_POST['submit'])){ $birthdate = new DateTime($_POST['yy'].'-'.$_POST['mm'].'-'.$_POST['dd' ]); $now = новая дата и время; $возраст = $дата рождения-›diff($сейчас); if ($age-›y ›= $minAge){ header('Расположение: 510vapour.com/main'< /а>); } else { header('Расположение: ../error.html'); } } ?› - person jigga_jones; 26.04.2016
comment
я сделал это и получил ошибку Неустранимая ошибка: неперехваченное исключение «Исключение» с сообщением «DateTime::__construct(): не удалось проанализировать строку времени (1989--) в позиции 4 (-): непредвиденный символ» в /home/cvrxldmw /public_html/php/access.php:7 Трассировка стека: #0 /home/cvrxldmw/public_html/php/access.php(7): DateTime-›__construct('1989--') #1 {main} добавлено в / home/cvrxldmw/public_html/php/access.php в строке 7 - person jigga_jones; 26.04.2016
comment
Эта ошибка выглядит так, как будто $_POST['mm'] и $_POST['dd'] были пустыми, и код в моем ответе зависит от того, установлены ли для них допустимые значения. Как я упоминал в своем предыдущем комментарии, вам нужно убедиться, что они хотя бы содержат числа, прежде чем использовать код в моем ответе. - person Don't Panic; 26.04.2016

Вот более простое решение:

if (time() < strtotime('+19 years', strtotime($dob))) {
   //User is under 19 years of age
   header('Location: ../error.html');
}else{
   header('Location: https://www.510vapour.com/main');
}

Действительно $dob

1979-02-21 or 21 Feb 1986


Вы также можете использовать скрипт jQuery для проверки возраста пользователя.

person Pedro Lobito    schedule 25.04.2016