PHP提交的表单中包含数量可变的字段和可变名称,请检查是否至少有一个

PHP提交的表单中包含数量可变的字段和可变名称,请检查是否至少有一个,php,forms,isset,name-attribute,Php,Forms,Isset,Name Attribute,好吧,我的标题可能有点混乱,但让我解释一下我的情况: 我有一个很大的表单,有很多字段,有些是必填的,有些不是。我用JS进行验证,但我也用PHP在服务器端进行验证 我向用户询问的一件事是“标题名”。现在,header name具有name属性“header1”。用户可以选择在表单上添加更多标题字段。因此,如果他们单击一个按钮,它会添加另一个名称属性为“headerx”的“headername X” 明白了吗?现在的问题是,通常这些头字段不是必需的,但我有一个条件,它们必须至少提供一个头字段。所以他

好吧,我的标题可能有点混乱,但让我解释一下我的情况:

我有一个很大的表单,有很多字段,有些是必填的,有些不是。我用JS进行验证,但我也用PHP在服务器端进行验证

我向用户询问的一件事是“标题名”。现在,header name具有name属性“header1”。用户可以选择在表单上添加更多标题字段。因此,如果他们单击一个按钮,它会添加另一个名称属性为“headerx”的“headername X”

明白了吗?现在的问题是,通常这些头字段不是必需的,但我有一个条件,它们必须至少提供一个头字段。所以他们可以提供100,他们可以提供2,他们可以提供1,但如果他们不提供任何,那么验证应该失败

不过,我想不出一个在PHP中检查这一点的好方法。我知道你的第一个想法是检查$u POST是否包含任何内容。但不起作用,因为此表单中有多个与这些标题无关的必填字段。因此,我不能简单地检查$u POST是否包含某些内容,因为它总是包含

有没有一种方法可以将isset()与正则表达式相结合?Like isset($_POST['header{\d+}')。表示后面至少有一个数字的Like header

谢谢你的帮助


编辑:哦,如果这还不够难的话,标题字段的数量是无限的。所以我不能循环所有可能的“headerx”,因为这显然是一个无限循环。

你可以循环通过如下元素:

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

这将持续进行,直到不再有连续元素。

您可以将字段名设置为[]:

<input type="text" name="foo[]" value="x" />
<input type="text" name="foo[]" value="y" />
甚至可以使用关联数组:

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

为什么不简单地这样看呢:在另一端的JS中,当您进行验证时,让最后一次检查来验证是否发送了一个标头——如果它通过了,请将表单中的隐藏字段设置为真值——然后在PHP中,您可以检查特定元素,而不必担心发送的每个可能的标头

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

这将允许按要求使用RegExp,但我也更喜欢jpic的解决方案,我也考虑过这一点。这会起作用,只是对我来说有点混乱。是的,这并不完美。@jpic提供的答案将很好地解决您的答案。好的,我最初想这样做,但我认为如果他们添加一个标题字段,而不是p但是里面的任何东西都不会被发送。但是我不知道我在想什么,因为它仍然会出现在$u的帖子中。谢谢你的解决方案。很好的解决方案。我不知道为什么我没有想到这个。
array('foo' => array('bar' => array('first' => 'x', 'second' => 'y')))
if(!count(preg_grep('@^header\d+$@',array_keys($_POST))))
{
  //no header submitted
}