【问题标题】:Is it valid to have two input elements with the same name?有两个同名的输入元素是否有效?
【发布时间】:2011-02-23 19:24:12
【问题描述】:

即:

<form 1>
<input type="hidden" name="url" value="1">
</form 1>

<form 2>
<input type="hidden" name="url" value="2">
</form 2>

这是否允许且有效?

【问题讨论】:

标签: html validation forms


【解决方案1】:
<form>
    <input type="hidden" name="url[]" value="1">  
    <input type="hidden" name="url[]" value="2">  
</form>

在 PHP 中,您将通过 $_POST['url'] 获取值

for($i=0;$i<count(url);$i++)
echo $_POST['url'][$i];

【讨论】:

    【解决方案2】:

    是的——每个人都只会提交各自的表格。

    如果你有相同的形式,一个会覆盖另一个,它是无效的。

    编辑: 正如 Mahmoodvcs 指出的那样,覆盖仅发生在某些语言(例如 PHP)中,而不是 HTML 本身固有的。

    【讨论】:

    • 你错了。如果您有多个具有相同名称的输入,则其中一个将不会覆盖另一个。所有输入将按照它们在 html 中出现的顺序附加到请求的正文中。它是有效的:HTML form with multiple hidden control elements of the same name
    • @Mahmoodvcs:严格来说这不是真的。如果表单发布到 PHP 服务,则最后一个值获胜。如果您想为一个名称分配多个值,则每个名称必须以 '[]' 结尾。
    • 我们在这里讨论的是 HTML,而不是 PHP。
    • @yardpenalty -- 我不明白你的问题(不确定 Jeff 是否会回应),但如果你质疑 PHP 的能力,这绝对是正确的(至少在 PHP7 之前 -- 我没有'不检查他们是否已经改变了)
    • 对不起,我想通了。如果要使用 php 进行处理,则必须创建名称数组。我认为引导程序需要单选按钮具有相同的名称或其他东西。无论如何,是的,你可以。
    【解决方案3】:

    A) 你的第一个例子没问题,因为提交的表单时间会有所不同:

    <form id="1">
        <input type="hidden" name="url" value="1">  
    </form>
    <form id="2">
        <input type="hidden" name="url" value="2">  
    </form>
    

    B)您的第二个示例也可以,但不是标准的编码实践:

    <form>
        <input type="hidden" name="url" value="1">  
        <input type="hidden" name="url" value="2">  
    </form>
    

    Java 代码二提取两个值:

    Map<String,String[]> parmMap = requestObj.getParameterMap();   
    String input1 = parmMap.get("url")[0];   
    String input2 = parmMap.get("url")[1];
    

    【讨论】:

      【解决方案4】:

      是的,有效

      这很好

      <form name="form1">
        <input type="hidden" name="url" value="1">
      </form>
      
      <form name="form2">
        <input type="hidden" name="url" value="2">
      </form>
      

      这也很好,通常会被解释为一个值数组,例如{url: [1, 2]},取决于你的服务器做什么。在 URL 编码中,它看起来像 url=1&amp;url=2

      <form name="form1">
        <input type="hidden" name="url" value="1">
        <input type="hidden" name="url" value="2">
      </form>
      

      【讨论】:

      • 有效。它不会对服务器端语言造成混淆(即使是 PHP,其命名字段共享名称的约定也将一致且可预测地处理不使用该约定的多个输入)。它不会对 JavaScript 造成混淆(它将元素呈现为一个集合并且忽略其中一个)。它/可能/会给编写代码而不知道自己在做什么的作者造成混乱,但按照规范这是可以的。
      • @David Dorward:感谢您的解释,我删除了那部分。
      • 这篇文章具有误导性。具有相同名称的输入具有相同的形式是 HTML 标准的一部分 - 例如,用于复选框。
      • 在一个表单中放置多个具有相同名称的输入(隐藏或其他)是有效的。此外,它在提交结构化列表或关联映射时非常有用,并且通常比 hacky DIY 序列化更简洁(且不那么脆弱)。
      • 我知道这是一篇旧帖子,但需要澄清一点。 PHP 需要你告诉它元素正在形成一个数组,如下所示: <input type="hidden" name="url[]" value="......."> 如果你不这样做这样做,php 将获取最后一个字段的最后一个值,并将其插入到表单数组中以获取键“url”。
      【解决方案5】:

      “这不好”在我所知道的每个浏览器上都能正确解析;如果两个 url 出现在 url 编码的字符串中,它将被视为一个数组。在 JQuery 中试试这个:

      $('<form name="form1">\
           <input type="hidden" name="url" value="1">\
           <input type="hidden" name="url" value="2">\
      </form>').serialize()
      

      你会得到:"url=1&amp;url=2"

      一个编写良好的查询字符串解析器将返回一个像这样的 json 结构:

       {"url":["1", "2"]}
      

      是否严格规范?不,但也不是像我上面那样通过用反斜杠转义 EOL 来创建多行字符串。

      【讨论】:

        【解决方案6】:

        要测试它是否有效,请在此处创建页面并在 W3C 进行测试:

        http://validator.w3.org/

        【讨论】:

        • 并希望验证器没有错误:-)
        【解决方案7】:

        是的。

        此外,如果您正在处理单选按钮组,则它是必不可少的。

        【讨论】:

        • 没错。或者使用复选框,在这种情况下,您可以将 [] 放在“url[]”的末尾,它会创建一个要拾取的数组。
        • @Kerry — 那是 PHP 主义。大多数表单处理库都乐于为控件组没有特殊名称。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-07-11
        • 1970-01-01
        • 2018-06-16
        • 2011-03-06
        • 2012-03-24
        • 2012-07-29
        • 1970-01-01
        相关资源
        最近更新 更多