Почему состояние флажка не всегда передается в сценарий PHP? - PullRequest
14 голосов
/ 26 марта 2010

У меня есть 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'] не установлено, то как узнать, не удалось ли сценарию передать значение или флажок был просто не установлен?

Ответы [ 4 ]

44 голосов
/ 26 марта 2010

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

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

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

5 голосов
/ 26 марта 2010

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

... тогда как мне узнать, не удалось ли сценарию передать значение или флажок был просто не установлен?

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


Относительно "это плохой дизайн":

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

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

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

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

4 голосов
/ 08 января 2013

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[]"/>

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

3 голосов
/ 26 марта 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...