Нюансы использования чекбоксов в PHP

Пусть в нашей форме есть только чекбокс:

html<form action="" method="GET">
  <input type="checkbox" name="flag">
  <input type="submit">
</form>

Пусть код обработки нашей формы выглядит вот так:

html<?php
  if (!empty($_GET)) { // если форма была отправлена
    if (isset($_GET['flag'])) { // если флажок отмечен
      echo 'отмечен';
    } else {
      echo 'не отмечен';
    }
  }
?>

Нас ждет проблема - если флажок не отмечен, то, так как в форме кроме чекбокса нет других элементов, в $_GET будет лежать пустой массив. Это значит, что в коде обработки формы мы не попадем в первый if, проверяющий отправку формы.

Для решения проблемы используют специальный прием: создают скрытый инпут с таким же именем, как и у нашего чекбокса. При этом значением скрытого инпута ставят ноль, а чебокса - единицу:

html<form action="" method="GET">
  <input type="hidden" name="flag" value="0">
  <input type="checkbox" name="flag" value="1">
  <input type="submit">
</form>

В таком случае получится следующее. Если чекбокс не отмечен, то на сервер отправится только значение скрытого инпута. Если же чекбокс отмечен, то на сервер отправятся оба значения с одним именем. Но, так как значение чекбокса будет вторым, то оно просто затрет первое.

Итак, теперь наша чекбокс будет отправлять на сервер или ноль, или один:

html<?php
  var_dump($_GET['flag']); // '0' или '1'
?>

Используем это в нашей проверке:

html<?php
  if (!empty($_GET)) {
    if ($_GET['flag'] === '1') {
      echo 'отмечен';
    } else {
      echo 'не отмечен';
    }
  }
?>
Задание 1

С помощью флажка спросите у пользователя, есть ему уже 18 лет или нет. Если есть, разрешите ему доступ на сайт, а если нет - не разрешите.