2010-03-26 2 views
14

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

<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'; 

Выход сценария, когда флажок установлен является

Set

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

Не установлено

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

ответ

43

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

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

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

+0

Утонченная идея! Никогда не думал об этом. –

+0

Как я использую HTML так долго и никогда не знал об этом! Я думаю, что это самый красивый код, который я когда-либо видел. – Gerry

+1

Не работает, если у вас есть несколько вариантов, например Vodaldrien

3

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

+0

Это очень плохая идея дизайна! Спасибо, в любом случае. –

+2

нет, его нет. его эффективность. – Jayrox

5

Только значение отмеченных флажков передается на сервер. Это 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, возможно, большинство из них просто говорит вам, что сделал пользователь не do.

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

+1

Easy: 'check_box_1 = true' и' check_box_1 = false' –

+0

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

+0

@George HTTP-протокол, который отправляется только, отправляет текст, который не имеет типа. Как вы отличаете флажок со значением '' false ''от флажка unset? – deceze

4

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

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

Смежные вопросы