0

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

我有一个很大的表格,里面有很多字段,有些是必需的,有些不是。我使用 JS 进行验证,但随后我也在使用 PHP 在服务器端进行验证。

我要求用户提供的一件事是“标题名称”。现在,标题名称具有“header1”的名称属性。用户可以选择在表单上添加更多标题字段。因此,如果他们单击一个按钮,它会添加另一个具有名称属性“headerx”的“Header Name X”。

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

我想不出在 PHP 中检查这个的好方法。我知道您的第一个想法就是检查 $_POST 是否包含任何内容。但是不起作用,因为它们是此表单中的多个其他字段,它们是必需的,与这些标题无关。所以我不能简单地检查 $_POST 是否包含某些东西,因为它总是会。

有没有一种方法可以让我喜欢将 isset() 与正则表达式结合起来?像 isset($_POST['header{\d+}']. 这就是说像标题后面至少有一个数字。

谢谢您的帮助!

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

4

4 回答 4

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')))
于 2012-09-12T01:01:19.430 回答
1

您可以像这样遍历元素:

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

这将一直持续到没有更多的顺序元素为止。

于 2012-09-12T01:01:06.020 回答
1

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

于 2012-09-12T01:02:38.667 回答
0
if(!count(preg_grep('@^header\d+$@',array_keys($_POST))))
{
  //no header submitted
}

这将允许根据要求使用 RegExp,但我也更喜欢 jpic 的解决方案

于 2012-09-12T01:05:34.083 回答