Давайте теперь научимся работать с флажками
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>
Сделайте три чекбокса, которые будут сохранять свое значение после отправки.