Чекбокс в PHP

Давайте теперь научимся работать с флажками checkbox в PHP. Сделаем такой флажок в нашей форме:

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

После отправки формы в $_GET флажка будет содержаться строка 'on', если флажок был отмечен и null, если нет:

<?php var_dump($_GET['flag']); // 'on' или null ?>

Давайте выведем что-нибудь на экран в зависимости от того, был отмечен флажок или нет:

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

Сделайте форму с инпутом и флажком. С помощью инпута спросите у пользователя имя. После отправки формы, если флажок был отмечен, поприветствуйте пользователя, а если не был отмечен - попрощайтесь.

Нюансы

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

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

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

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

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

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

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

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

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

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

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

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

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

Сохранение значения после отправки

Давайте теперь сделаем так, чтобы значение чекбокса сохранялось после отправки. Для этого проверим, что $_GET['flag'] существует (то есть была отправка формы) и равен единице (то есть флажок отмечен).

Если эти два условия выполняются, то выведем в чекбоксе атрибут checked:

<form action="" method="GET"> <input type="hidden" name="flag" value="0"> <input type="checkbox" name="flag" <?php if (isset($_GET['flag']) and $_GET['flag'] === '1') echo 'checked'; ?> > <input type="submit"> </form>

Проверку можно упростить, если мы точно знаем, что скрытый инпут передает 0. В таком случае, если чекбокс не отмечен, то в $_GET['flag'] будет лежать '0', а если отправки формы еще не было, то будет лежать null.

В обоих этих случаях мы не должны выводить checked. И оба этих случая мы можем поймать функцией empty. Таким образом мы можем проверить, что $_GET['flag'] не пуст, и только в этом случае вывести checked:

<form action="" method="GET"> <input type="hidden" name="flag" value="0"> <input type="checkbox" name="flag" value="1" <?php if (!empty($_GET['flag'])) echo 'checked' ?> > <input type="submit"> </form>

Сделайте три чекбокса, которые будут сохранять свое значение после отправки.