Несколько слов о флажках checkbox
Переключатель с независимым выбором (checkbox или более коротко— флажок) имеет одну довольно неприятную особенность, которая иногда может помешать Web-программисту. Вы, наверное, помните, что когда перед отправкой формы пользователь установил его в выбранное состояние, то сценарию в числе других параметров приходит пара имя_флажка=значение.
В то же время, если флажок не был установлен пользователем, указанная пара не посылается. Часто это бывает не совсем то, что нужно. Мы бы хотели, чтобы в невыбранном состоянии флажок также присылал данные, но только значение было равно какой-нибудь специальной величине — например, нулю или пустой строке.
К нашей радости, добиться этого эффекта в PHP довольно несложно. Достаточно воспользоваться одноименным скрытым полем (hidden) со значением, равным, например, нулю, разместив его перед нужным флажком. Вот пример:
Листинг 33.5. Гарантированная установка значений флажков
<?
if(@$Go) {
foreach($Known as $k=>$v)
if($v) echo "Вы знаете язык $k!<br>";
else echo "Вы не знаете языка $k. <br>";
}
?>
<form action=lang.php method=post>
Какие языки программирования вы знаете?<br>
<input type=hidden name=Known[PHP] value=0>
<input type=checkbox name= Known[PHP] value=1>PHP<br>
<input type=hidden name=Known[Perl] value=0>
<input type=checkbox name= Known[Perl] value=1>PHP<br>
<input type=submit name=Go value="Go!">
</form>
Теперь в случае, если пользователь не выберет какой-нибудь из флажков, браузер отправит сценарию пару Known[язык]=0, сгенерированную соответствующим скрытым полем, и в массиве $Known создастся соответствующий элемент. Если пользователь выбрал
флажок, эта пара также будет послана, но сразу же после нее последует пара Known[язык]=1, которая "перекроет" предыдущее значение.
Не включи мы скрытые поля в форму из листинга 33.5, сценарий печатал бы только сообщения о тех языках, которые "знает пользователь", пропуская языки, ему "неизвестные". В нашем же случае сценарий реагирует и на неустановленные флажки.
Такой способ немного увеличивает объем данных, передаваемых методом POST, за счет тех самых пар, которые генерируются скрытыми полями. Впрочем, в реальной жизни это "увеличение" практически незаметно (особенно для POST-форм).