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

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

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

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

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

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

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

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

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

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

Вы можете циклически проходить по таким элементам:

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

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

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

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

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

Другие вопросы по тегам