【问题标题】:PHP submitting form with a variable amount of fields with variable names, check if at least one setPHP提交带有变量名称的可变数量字段的表单,检查是否至少设置了一个
【发布时间】:2012-09-12 00:55:08
【问题描述】:

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

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

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

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

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

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

感谢您的帮助!

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

【问题讨论】:

    标签: php forms isset name-attribute


    【解决方案1】:

    您可以使用 []: 的字段名称:

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

    【讨论】:

    • 很好的解决方案。不知道为什么我没有想到这一点。
    【解决方案2】:

    你可以像这样循环遍历元素:

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

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

    【讨论】:

    • 好的,我最初想这样做,但我想如果他们添加一个标题字段然后不放任何东西,它就不会被发送。但我不知道我在想什么,因为它仍然会出现在 $_POST 中。感谢您的解决方案。
    【解决方案3】:

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

    【讨论】:

    • 我也考虑过这个。行得通,只是对我来说有点乱。
    • 是的,它并不完美。 @jpic 提供的答案将很好地解决您的答案。
    【解决方案4】:
    if(!count(preg_grep('@^header\d+$@',array_keys($_POST))))
    {
      //no header submitted
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-06
      • 2011-03-30
      • 1970-01-01
      • 2014-09-15
      • 1970-01-01
      • 2010-10-28
      • 2020-04-07
      • 1970-01-01
      相关资源
      最近更新 更多