Форма отправки PHP с переменным количеством полей с именами переменных, проверьте, установлен ли хотя бы один

Итак, мой заголовок может быть немного запутанным, но позвольте мне объяснить мою ситуацию:

У меня довольно большая форма с множеством полей, некоторые из которых обязательны, некоторые нет. Я выполняю проверку с помощью JS, но затем я также выполняю проверку на стороне сервера с помощью PHP.

Одна из вещей, о которых я прошу пользователя, - это «Имя заголовка». Теперь имя заголовка имеет атрибут имени «header1». У пользователя есть возможность добавить дополнительные поля заголовка в форму. Поэтому, если они нажимают кнопку, добавляется еще одно «Имя заголовка X» с атрибутом имени «headerx».

Понятно? Теперь проблема в том, что в общем случае эти поля заголовка не требуются, но у меня есть условие, что они ДОЛЖНЫ предоставлять хотя бы одно поле заголовка. Таким образом, они могут предоставить 100, они могут предоставить 2, они могут предоставить 1, но если они ничего не предоставят, то проверка должна завершиться неудачно.

Я не могу придумать хороший способ проверить это в PHP. Я знаю, что ваша первая мысль — просто проверить, содержит ли что-нибудь $_POST. Однако это не сработает, потому что в этой форме есть несколько других обязательных полей, которые не имеют ничего общего с этими заголовками. Поэтому я не могу просто проверить, содержит ли $_POST что-то, потому что так будет всегда.

Есть ли способ объединить isset() с регулярным выражением? Например, isset($_POST['header{\d+}']. Это будет выглядеть как заголовок, за которым следует хотя бы одна цифра.

Спасибо за помощь!

РЕДАКТИРОВАТЬ: О, и если это уже не было достаточно сложно, количество полей заголовка безгранично. Так что я не могу просто перебрать все возможные «заголовки», потому что это, очевидно, будет бесконечным циклом.


person user1513171    schedule 12.09.2012    source источник


Ответы (4)


У вас могут быть имена полей с []:

<input type="text" name="foo[]" value="x" />
<input type="text" name="foo[]" value="y" />

Тогда $_POST будет выглядеть так:

array('foo' => array('x', 'y'));

У вас могут быть даже ассоциативные массивы:

<input type="text" name="foo[bar][first]" value="x" />
<input type="text" name="foo[bar][second]" value="y" />

Будет выглядеть так:

array('foo' => array('bar' => array('first' => 'x', 'second' => 'y')))
person jpic    schedule 12.09.2012
comment
Отличное решение. Не знаю, почему я не подумал об этом. - person user1513171; 12.09.2012

Вы можете перебирать элементы следующим образом:

$i = 1;
while($row = $_POST['header' . $i++]){
    //do stuff
}

это будет продолжаться до тех пор, пока не останется последовательных элементов.

person G-Nugget    schedule 12.09.2012
comment
Хорошо, я сначала думал сделать это, но я понял, что если они добавят поле заголовка, а затем ничего в него не поместят, оно не будет отправлено. Но я не знаю, о чем я думал, потому что это все равно будет отображаться в $_POST. Спасибо за ваше решение. - person user1513171; 12.09.2012

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

person Fluffeh    schedule 12.09.2012
comment
Я тоже это учитывал. Сработает, просто мне кажется немного грязным. - person user1513171; 12.09.2012
comment
Да, это не идеально. Ответ, который предоставил @jpic, хорошо решит ваш ответ. - person Fluffeh; 12.09.2012

if(!count(preg_grep('@^header\d+$@',array_keys($_POST))))
{
  //no header submitted
}

Это позволит использовать RegExp по запросу, но я также предпочел бы решение jpic.

person Dr.Molle    schedule 12.09.2012