Отправить HTML-форму с пустыми флажками
У меня есть HTML-форма - с PHP, я отправляю данные формы в базу данных MySQL. Некоторые ответы на вопросы по форме имеют флажки. Очевидно, пользователю не нужно указывать все флажки для одного вопроса. Я также хочу, чтобы другие вопросы (включая радиогруппы) были необязательными.
Однако, если я отправлю форму с пустыми полями, радио-группами и т.д., я получил длинный список сообщений об ошибках Undefined index для каждого из них.
Как я могу обойти это? Спасибо.
Ответы
Ответ 1
Неконтролируемые радио или элементы флажка не отправляются, поскольку они не считаются успешными. Поэтому вам нужно проверить, отправлены ли они с помощью функции isset
или empty
.
if (isset($_POST['checkbox'])) {
// checkbox has been checked
}
Ответ 2
Я использовал эту технику время от времени:
<input type="hidden" name="the_checkbox" value="0" />
<input type="checkbox" name="the_checkbox" value="1" />
note: Это интерпретируется по-разному на разных серверных языках, поэтому при необходимости протестируйте и настройте. Благодаря SimonSimCity для подсказки.
Ответ 3
Неконтролируемый флажок не отправляется в данных POST.
Вы должны просто проверить, не пуст ли он:
if (empty($_POST['myCheckbox']))
....
else
....
В PHP empty()
и isset()
не генерируют уведомления.
Ответ 4
Ниже приведено простое обходное решение с использованием javascript:
перед отправкой формы, содержащей флажки, установите "off" на 0 и проверьте их, чтобы они были отправлены. это работает, например, для checkbox-массивов.
/////example//////
задана форма с id = "formId"
<form id="formId" onSubmit="return formSubmit('formId');" method="POST" action="yourAction.php">
<!-- your checkboxes here . for example: -->
<input type="checkbox" name="cb[]" value="1" >R
<input type="checkbox" name="cb[]" value="1" >G
<input type="checkbox" name="cb[]" value="1" >B
</form>
<?php
if($_POST['cb'][$i] == 0) {
// empty
} elseif ($_POST['cb'][$i] == 1) {
// checked
} else {
// ????
}
?>
<script>
function formSubmit(formId){
var theForm = document.getElementById(formId); // get the form
var cb = theForm.getElementsByTagName('input'); // get the inputs
for(var i=0;i<cb.length;i++){
if(cb[i].type=='checkbox' && !cb[i].checked) // if this is an unchecked checkbox
{
cb[i].value = 0; // set the value to "off"
cb[i].checked = true; // make sure it submits
}
}
return true;
}
</script>
Ответ 5
Чтобы добавить код fmsf, добавляя флажки, я делаю их массивом, имея [] в имени
<FORM METHOD=POST ACTION="statistics.jsp?q=1&g=1">
<input type="radio" name="gerais_radio" value="primeiras">Primeiras Consultas por medico<br/>
<input type="radio" name="gerais_radio" value="salas">Consultas por Sala <br/>
<input type="radio" name="gerais_radio" value="assistencia">Pacientes por assistencia<br/>
<input type="checkbox" name="option[]" value="Option1">Option1<br/>
<input type="checkbox" name="option[]" value="Option2">Option2<br/>
<input type="checkbox" name="option[]" value="Option3">Option3<br/>
<input type="submit" value="Ver">
Ответ 6
Используйте этот
$myvalue = (isset($_POST['checkbox']) ? $_POST['checkbox'] : 0;
Или замените любое значение no для 0
Ответ 7
У нас есть проблема с обнаружением того, какой из них проверен или нет.
Если вы заполняете форму в цикле for, используйте свойство value в качестве владельца данных:
<?php for($i=1;$i<6;$i++):?>
<input type="checkbox" name="active[]" value="<?php echo $i ?>"
<?endfor;?>
Если вы отправите форму, вы получите порядковые номера отмеченных флажков (в этом случае я проверил 3-й и 4-й флажки):
array(1) {
["active"]=>
array(2) {
[0]=>
string(1) "3"
[1]=>
string(1) "4"
}
}
Когда вы обрабатываете данные формы в цикле, скажем, в post.php, используйте следующий код, чтобы определить, выбрана ли соответствующая строка:
if(in_array($_POST['active'] ,$i))
$answer_result = true;
else
$answer_result = false;
Окончательный код для тестирования:
<?php if (isset($_POST) && !empty($_POST)):
echo '<pre>';
var_dump($_POST);
echo '</pre>';
endif;
?>
<form action="test.php" method="post">
<?php for($i=1;$i<6;$i++):?>
<input type="checkbox" name="active[]" value="<?php echo $i; ?>" />
<?php endfor;?>
<button type="submit">Submit</button>
</form>
Ответ 8
Хотя многие ответы были представлены, мне пришлось импровизировать для моего собственного решения, потому что я использовал настраиваемые флажки. Другими словами, ни один из ответов не работал у меня.
То, что я хотел получить, - это массив флажков с значениями включения и выключения. Хитрость заключалась в том, чтобы отправить для каждого флажка значение вкл/выкл разделителя. Допустим, что разделитель ";" поэтому строка, которую вы получаете,
;, on,;,;,;
Затем, как только вы получите сообщение, просто разделите данные на массив, используя символ "," в качестве символа для разделения, а затем, если элемент массива содержит "on", флажок включен, в противном случае он выкл.
Для каждого флажка измените идентификатор, все остальное будет таким же... и синтаксис, который повторяется, следующий:
<div>
<input type="hidden" name="onoffswitch" class="onoffswitch-checkbox" value=";" />
...some other custom code here...
<input type="checkbox" name="onoffswitch" class="onoffswitch-checkbox" id="myonoffswitch1" checked>
</div>
EDIT: вместо ";" вы можете использовать некоторое значение строки KEY, и таким образом вы узнаете, что вы не испортили заказ, как только POST будет получен на стороне сервера... таким образом вы можете легко создать карту, хэш или что-то еще. PS: держите их в одном теге div.