好的,所以我的头衔可能有点令人困惑,但让我解释一下我的情况:
我有一个非常大的形式,有很多字段,有些是必需的,有些则不是。我用JS进行验证,但后来我也在用PHP验证服务器端。
我要求用户提出的一个问题是“标题名称”。现在,标题名称的名称属性为“header1”。用户可以选择在表单上添加更多标题字段。因此,如果他们单击一个按钮,则会添加另一个名称属性为“headerx”的“标题名称X”。
知道了吗?现在,问题是,通常这些头字段不是必需的,但我确实有条件,它们必须提供至少一个Header字段。所以他们可以提供100,他们可以提供2,他们可能提供1,但如果他们不提供任何,那么验证应该失败。
我想不出在PHP中检查这个的好方法。我知道你的拳头想法只是检查$ _POST是否包含任何内容。但是不会起作用,因为它们是这个表单中的多个其他字段,这些字段与这些Headers无关。所以我不能只是简单地检查$ _POST是否包含某些东西,因为它总是会。
我有没有办法将isset()与正则表达式结合起来?就像isset一样($ _ POST ['header {\ d +}']。这就像是标题后面跟着至少一位数。
感谢您的帮助!
编辑:哦,如果这已经不够了,那么标题字段的数量是无限的。所以我不能只遍历所有可能的“标题”,因为这显然是一个无限循环。
答案 0 :(得分:5)
您可以使用[]:
创建字段名称<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')))
答案 1 :(得分:1)
你可以循环遍历这样的元素:
$i = 1;
while($row = $_POST['header' . $i++]){
//do stuff
}
这将持续到没有更多顺序元素。
答案 2 :(得分:1)
为什么不这样简单地看待它:在另一端的JS中,当你进行验证时,最后检查一下以检查是否发送了一个标题 - 并且它通过了,设置一个隐藏的字段表单为 true 值 - 然后在PHP中,您可以检查该特定元素,而不必担心发送的每个可能的标头。
答案 3 :(得分:0)
if(!count(preg_grep('@^header\d+$@',array_keys($_POST))))
{
//no header submitted
}
这将允许按要求使用RegExp,但我也更喜欢jpic的解决方案