Почему состояние флажка не всегда передается скрипту PHP?

У меня есть HTML-форма:

<form action='process.php' method='post'> <input type='checkbox' name='check_box_1' /> Check me!<br> </form> 

Вот раздел из скрипта PHP process.php :

 echo (isset($_POST['check_box_1']))?'Set':'Not set'; 

Вывод скрипта при установке флажка

Задавать

Но когда флажок не установлен, выход:

Не задано

Почему это? Это выглядит очень плохой дизайн, потому что мой PHP-скрипт проверяет несколько переменных $_POST чтобы убедиться, что они были переданы вместе с скриптом. Когда значение $_POST['check_box_1'] не задано, как узнать, не прошел ли сценарий по значению, или флажок не был установлен?

Related of "Почему состояние флажка не всегда передается скрипту PHP?"

Если вы хотите преодолеть эту конструктивную особенность, попробуйте следующее:

 <input type="hidden" name="check_box_1" value="0" /> <input type="checkbox" name="check_box_1" value="1" /> 

Таким образом, на странице обратного вызова всегда будет установлен параметр $_POST['check_box_1'] , а затем вы можете просто проверить его значение, чтобы проверить, проверены ли они. Эти два входа должны быть в этом порядке, хотя, поскольку более поздний будет иметь приоритет.

На сервер отправляется только значение отмеченных флажков. Это HTML / браузерный дизайн и не имеет ничего общего с PHP. Как еще вы надежно отличаете отмеченный флажок от неконтролируемого?

… то как узнать, не прошел ли скрипт по значению или флажок не был установлен?

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


Что касается «плохой дизайн»:

Это эффективный дизайн. Есть только две другие возможности, учитывая ограничение, что значения отправляются только как текст:

  1. Отправьте как значение, так и состояние отдельно, например checkbox:state=checked&checkbox:value=myvalue . Давайте притворимся на секунду, что это не вызовет серьезных головных болей и двусмысленностей в том, что разрешено для имен входных элементов, а что нет.
  2. Используйте магическое значение для обозначения «unchecked»: checkbox=false . Это означает, что я не могу сделать такой флажок: <input type="checkbox" name="checkbox" value="false" />

Давайте сделаем вид, что будет использовано решение выше, и проблемы, связанные с ними, будут решены. Это означало бы, что для каждого флажка на странице будет отправлено значение POST. Обычно это неважно, но давайте представим страницу с 50 флажками. Я бы сказал, что не слишком нереалистично. А что с 200? Это 200 * ~10+ символов в HTTP-заголовках для каждого POST, возможно, большинство из них просто говорит вам, что пользователь не делал.

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

nickf предоставил лучший ответ, но он не будет работать в специальном случае, если у вас есть несколько флажков с тем же именем. Вместо этого (если вы используете jQuery), вы можете использовать фальшивый флажок, чтобы переключать значение реального скрытого ввода следующим образом:

 <input type="checkbox" onclick="$(this).next().val(this.checked?1:0)"/> <input type="hidden" name="verified[]"/> <input type="checkbox" onclick="$(this).next().val(this.checked?1:0)"/> <input type="hidden" name="verified[]"/> 

Обратите внимание, что указаны только скрытые флажки.

К сожалению, так работает спецификация для флажков в представленных формах – если флажок не установлен, браузер не обязательно отправляет это поле вообще.