РЕДАКТИРОВАТЬ: вместо «;», вы можете использовать некоторое строковое значение KEY, и таким образом вы будете знать, что вы не испортили порядок, как только POST получен на стороне сервера ... таким образом, вы можете легко создать карту, хэш или что-то еще. PS: держите их обоих в одном теге div.

я есть HTML-форма - с помощью PHP я отправляю данные формы в базу данных MySQL. Некоторые из ответов на вопросы в форме имеют флажки. Очевидно, что пользователю не нужно ставить все флажки для одного вопроса. Я также хочу, чтобы другие вопросы (включая группы радиосвязи) были необязательными.

Однако, если я отправляю форму с пустыми ящиками, радиогруппами и т. Д., Я получаю длинный список сообщений об ошибках «Неопределенный индекс» для каждого из них.

Как я могу обойти это? Благодарю.

Ответы на вопрос(8)

Использовать это

$myvalue = (isset($_POST['checkbox']) ? $_POST['checkbox'] : 0;

Или замените все, что ваше значение не для 0

 Jeroen Bellemans04 мая 2015 г., 15:44
Почему бы просто не использоватьfalse для «0»?
Решение Вопроса

так как они не считаютсяуспешный, Таким образом, вы должны проверить, если они отправлены с использованиемisset или жеempty функция.

if (isset($_POST['checkbox'])) {
    // checkbox has been checked
}
 KayEss20 июл. 2009 г., 12:08
И в форме вам нужно убедиться, что элементы checkbox имеют установленное значение, иначе некоторые пользовательские агенты также не сочтут флажок успешным.

перед отправкой формы, содержащей флажки, установите «выключенные» в 0 и проверьте их, чтобы убедиться, что они отправляют. это работает для массивов флажков, например.

///// пример //////

дали форму с 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>

Если вы заполняете форму в цикле 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>

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

Я хотел получить массив флажков со значениями включения и выключения. Хитрость заключалась в том, чтобы представить для каждого флажка значение вкл / выкл разделитель. Допустим, что разделитель это ";" так что строка, которую вы получите

;, на,;,;,;

Затем, как только вы получите свое сообщение, просто разбейте данные на массив, используя «,» как символ для разделения, а затем, если элемент массива содержит «вкл», флажок включен, в противном случае он выключен.

Для каждого флажка измените идентификатор, все остальное - то же самое ... и синтаксис, который повторяется:

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

РЕДАКТИРОВАТЬ: вместо «;», вы можете использовать некоторое строковое значение KEY, и таким образом вы будете знать, что вы не испортили порядок, как только POST получен на стороне сервера ... таким образом, вы можете легко создать карту, хэш или что-то еще. PS: держите их обоих в одном теге div.

роверить, если он пуст:

if (empty($_POST['myCheckbox']))
     ....
else
     ....

В PHPempty() а такжеisset() не генерировать уведомления.

Я использовал эту технику время от времени:

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

нота: Это интерпретируетсяиначе на разных серверных языках, поэтому тестируйте и корректируйте при необходимости. БлагодаряSimonSimCity для чаевых.

 John Leidegren10 авг. 2009 г., 18:16
Моя проблема немного сложнее, чем предложенная здесь, но ваше решение вполне соответствует моим потребностям.
 Bogdan02 февр. 2011 г., 21:38
Это очень полезный трюк!
 ceejayoz20 июл. 2009 г., 15:42
Это работает во всех браузерах, с которыми я сталкивался. Маловероятно, что это тоже изменится.
 KayEss20 июл. 2009 г., 12:07
Полагаясь на веб-браузер, учитывающий порядок успешных элементов формы на странице, и сценарии на стороне сервера, выполняющие его, тоже вызывают проблемы.
 John Leidegren10 авг. 2009 г., 18:14
Вы заслуживаете лучшего рейтинга. Давайте сделаем некоторые исследования! Из спецификации HTML 4.01 см. «17.13.3 Обработка данных формы». Шаг второй: Создайте набор данных формы. Msgstr "Набор данных формы - это последовательность пар имя элемента управления / текущее значение ...". Последовательность подразумевает логический порядок (вы можете найти это где угодно), следовательно, то, что вы хотите, может быть даже определено стандартом. Хотя это не без недостатков, я заинтригован, чтобы начать использовать это прямо сейчас.

при добавлении флажков я делаю их массивом, используя [] в имени

<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">

Ваш ответ на вопрос