У меня есть HTML-форма – с PHP, я отправляю данные формы в базу данных MySQL. Некоторые ответы на вопросы по форме имеют флажки. Очевидно, пользователю не нужно указывать все флажки для одного вопроса. Я также хочу, чтобы другие вопросы (включая радиогруппы) были необязательными.
Однако, если я отправлю форму с пустыми полями, радио-группами и т. Д., Я получил длинный список сообщений об ошибках «Undefined index» для каждого из них.
Как я могу обойти это? Благодарю.
Непроверенные радио или элементы флажка не отправляются, поскольку они не считаются успешными . Поэтому вам нужно проверить, отправлены ли они с помощью функции isset
или empty
.
if (isset($_POST['checkbox'])) { // checkbox has been checked }
Я использовал эту технику время от времени:
<input type="hidden" name="the_checkbox" value="0" /> <input type="checkbox" name="the_checkbox" value="1" />
Примечание. Это интерпретируется по- разному на разных серверных языках, поэтому проверяйте и при необходимости отрегулируйте. Благодаря SimonSimCity для наконечника.
Флажок непроверенный не отправляется в данных POST. Вы должны просто проверить, не пуст ли он:
if (empty($_POST['myCheckbox'])) .... else ....
В PHP empty()
и isset()
не генерируются уведомления.
Вот простой способ обхода проблемы с помощью javascript:
перед отправкой формы, содержащей флажки, установите «выключен» на 0 и проверьте их, чтобы они были отправлены. это работает, например, для checkbox-массивов.
///// пример //////
учитывая форму с 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>
Чтобы добавить код 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">
Использовать это
$myvalue = (isset($_POST['checkbox']) ? $_POST['checkbox'] : 0;
Или замените то, что не имеет значения для 0
У нас проблемы с обнаружением того, какой из них проверен или нет.
Если вы заполняете форму в цикле 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>
Хотя многие ответы были представлены, мне пришлось импровизировать для моего собственного решения, потому что я использовал настраиваемые флажки. Другими словами, ни один из ответов не работал для меня.
То, что я хотел получить, – это набор флажков с значениями включения и выключения. Хитрость заключалась в том, чтобы отправить для каждого флажка значение вкл / выкл разделителя. Допустим, что разделитель «;» поэтому строка, которую вы получаете, это
;, 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.