Не отмеченные флажки в массиве - PullRequest
2 голосов
/ 31 марта 2011

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

, скрипт:

<?php
foreach ($_POST as $key => $value) {
  $$key = $value;
}
$count = count($name);
for ($i=0; $i<$count; $i++){
?>
  <strong><?php echo $name[$i]; ?></strong>  (<?php echo $check[$i]; ?>)<br /><?php echo $select[$i]; ?><br /><br />
<?php
}
?>
<form method="post">
<div class="group">
 <input type="text" name="name[]" /><br />
 <input type="checkbox" name="check[]" value="true" /><br />
 <select name="select[]"><option>1</option><option>2</option><option>3</option></select>
</div>
<div class="group">
 <input type="text" name="name[]" /><br />
 <input type="checkbox" name="check[]" value="true" /><br />
 <select name="select[]"><option>1</option><option>2</option><option>3</option></select>
</div>
<div class="group">
 <input type="text" name="name[]" /><br />
 <input type="checkbox" name="check[]" value="true" /><br />
 <select name="select[]"><option>1</option><option>2</option><option>3</option></select>
</div>
<button>Add another group</button>
<input type="submit" />
</form>

Есливсе флажки отмечены, проблем нет, но если проверен только последний, он учитывает только один флажок в массиве, имя [0] затем объединяется с check [0], но check [0] действительно check [2].Английский не мой родной язык, поэтому я не знаю правильных слов.

Ответы [ 3 ]

7 голосов
/ 17 июля 2012

На самом деле, для этого есть достойный обходной путь, предложенный Сэмом в ответе на переполнение стека:

Поставьте флажки, которые не отмечены

Это сработало дляя, и я подозреваю, что у вас и у меня была похожая проблема (у меня было более 300 полей ввода в похожих (ish) группах и я не хотел писать правила проверки для каждого из этих отдельных полей, только правиланацелены на каждое семейство типов ввода, например, адреса электронной почты или почтовые индексы. Вкратце, техника заключается в том, что вы помещаете скрытое поле ввода с тем же именем перед полем вашего флажка. Установка значения скрытого поля (type =От «скрытого») к «0» будет гарантировано, что по крайней мере один ключ / значение появится в вашем POST-массиве, причем «0» заменяется более поздним «1», только если флажок установлен. Мне нужно значение «0»чтобы позволить людям «отменить» опцию, которую они ранее «установили», например, что они хотели показать свои контактные данные. Этот метод позволяет мне представитьt пользователь с такой же формой для обновления, какой он получил бы при первой регистрации.Спасибо Сэму!

2 голосов
/ 31 марта 2011

Это нормальное поведение PHP, когда флажок не установлен, он не включает его в переменную $ _POST ...

1 голос
/ 31 марта 2011

Да. Вот так вот. Для этого нет обходного пути. Использование field[] идентификаторов применимо только для неструктурированных полей ввода. Если вы зависите от порядка и отношения, то неустановленные поля помешают этому.

У вас нет другого выбора, кроме как установить явные индексы. Вы должны укусить кислое яблоко и сделать это для name[0], check[1] и select[2]. Используйте цикл PHP, чтобы упростить его:

foreach (range(0,2) as $i)
echo <<< END
<div class="group">
 <input type="text" name="name[$i]" /><br />
 <input type="checkbox" name="check[$i]" value="true" /><br />
 <select name="select[$i]"><option>1</option><option>2</option><option>3</option></select>
</div>
END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...