Почему состояние checkbox не всегда передается вместе с PHP скрипт?
У меня есть HTML-форма:
<form action='process.php' method='post'>
<input type='checkbox' name='check_box_1' /> Check me!<br>
</form>
Вот раздел из PHP script process.php
:
echo (isset($_POST['check_box_1']))?'Set':'Not set';
Вывод script при установке флажка
Set
Но если флажок не установлен, на выходе будет:
Не установлено
Почему это? Это выглядит очень плохо, потому что мой PHP script проверяет несколько переменных $_POST
, чтобы убедиться, что они были переданы вместе с script. Когда значение $_POST['check_box_1']
не установлено, то откуда я могу узнать, не удалось ли script передать значение или флажок не был установлен?
Ответы
Ответ 1
Если вы хотите преодолеть эту конструктивную особенность, попробуйте следующее:
<input type="hidden" name="check_box_1" value="0" />
<input type="checkbox" name="check_box_1" value="1" />
Таким образом, на странице обратного вызова всегда будет установлен $_POST['check_box_1']
, а затем вы можете просто проверить его значение, чтобы проверить, проверяли ли они его или нет. Два входа должны быть в этом порядке, хотя, поскольку более поздний будет иметь приоритет.
Ответ 2
На сервер отправляется только значение отмеченных флажков. Это HTML/браузерный дизайн и не имеет ничего общего с PHP. Как еще вы надежно отличаете отмеченный флажок от неконтролируемого?
... то как узнать, не удалось ли передать script по значению или флажок не установлен?
Вы можете доверять браузеру и PHP, чтобы все было правильно. Если он не установлен, поле не было проверено. Если вы используете Javascript, который представляет форму и может ошибаться, это ваша ответственность отлаживать ваш script.
Относительно "плохой дизайн":
Это эффективный дизайн. Есть только две другие возможности, учитывая ограничение того, что значения отправляются только как текст:
- Отправьте как значение, так и состояние отдельно, например
checkbox:state=checked&checkbox:value=myvalue
. Давайте сделаем вид на секунду, что это не вызовет серьезных головных болей и двусмысленностей в том, что разрешено для имен входных элементов, а что нет.
- Используйте магическое значение для обозначения "unchecked":
checkbox=false
. Это означает, что я не могу установить флажок: <input type="checkbox" name="checkbox" value="false" />
Предположим, что будет использовано либо решение выше, и проблемы, связанные с ними, будут решены. Это означало бы, что для каждого флажка на странице будет отправлено значение POST. Обычно это неважно, но представьте себе страницу с 50 флажками. Я бы сказал, что не слишком нереалистично. А что с 200? Это 200 * ~10+
символы в заголовках HTTP для каждого POST, возможно, большинство из них просто говорит вам, что сделал пользователь не.
Поскольку этот метод был изобретен, когда ширина полосы пропускания была очень ценной, она наиболее эффективна, чтобы просто не отправлять значения отмеченных флажков.
Ответ 3
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[]"/>
Обратите внимание, что указаны только скрытые флажки.
Ответ 4
К сожалению, как работает спецификация для флажков в представленных формах - если флажок не установлен, браузер не обязательно отправляет это поле вообще.