【问题标题】:Request does not return all data from the form请求不返回表单中的所有数据
【发布时间】:2019-10-18 13:47:20
【问题描述】:

我有一个部分,用户可以在其中添加输入值,并且可以添加任意数量的输入字段。第一个输入字段默认添加到 DOM。

表格是这样的

这是此表单的 HTML,假设用户添加了一个输入字段

<dvi class="container h-100">
    <div class="d-flex justify-content-center">
        <div class="card mt-5 col-md-12 animated bounceInDown myForm" id="multiple-container">
            <div class="card-header">
                <h4>Bidders Information</h4>
            </div>
            <div class="card-body" id="add_info">

                <div id="dynamic_container">
                    <small id="bidder">Bidder 1</small>
                    <span class="bmd-form-group"><div class="input-group">
                            <div class="input-group-prepend">
                              <span class="input-group-text br-15"><i class="fa fa-tags"></i></span>
                </div>
                <input type="text" placeholder="Bidders Name" name="bidder_name" class="form-control">
            </div>
            </span>
            <span class="bmd-form-group"><div class="input-group mt-3">
                            <div class="input-group-prepend">
                              <span class="input-group-text br-15"><i class="fa fa-tags"></i></span>
        </div>
        <input type="text" placeholder="atribute name" name="params_name" id="field1" class="form-control">
        <input type="text" placeholder="atribute value" name="params_value" id="field2" class="form-control">
        <a class="btn btn-secondary btn-sm moreinput_field" id="add_more_input">
            <i class="fa fa-plus-circle"></i>
        </a>
    </div>
    </span>
    </div>

    </div>
    <div class="card-body" id="add_info0">

        <div id="dynamic_container">
            <small id="bidder">Bidder 2</small>
            <span class="bmd-form-group"><div class="input-group">
                            <div class="input-group-prepend">
                              <span class="input-group-text br-15"><i class="fa fa-tags"></i></span>
        </div>
        <input type="text" placeholder="Bidders Name" name="bidder_name" class="form-control">
    </div>
    </span>
    <span class="bmd-form-group"><div class="input-group mt-3">
                            <div class="input-group-prepend">
                              <span class="input-group-text br-15"><i class="fa fa-tags"></i></span>
    </div>
    <input type="text" placeholder="atribute name" name="params_name" id="field1" class="form-control">
    <input type="text" placeholder="atribute value" name="params_value" id="field2" class="form-control">
    <a class="btn btn-secondary btn-sm more_input moreinput_field" id="add_more_input0">
        <i class="fa fa-plus-circle"></i>
    </a>
    </div>
    </span>
    <a class="btn btn-danger btn-sm" id="remove-more"><i class="fa fa-trash"></i></a>
    </div>
    </div>
    <div class="card-footer" id="card-footer">
        <a class="btn btn-success btn-sm" id="add_more"><i class="fa fa-plus-circle"></i> Add<div class="ripple-container"></div></a>

        <button class="btn btn-success btn-sm float-right submit_btn"><i class="fas fa-arrow-alt-circle-right"></i> Submit</button>
    </div>
    </div>
    </div>
</dvi>

在我的控制器上,我有这个。

   public function store(Request $request){

            dd($request);
    }

返回以下内容

如您所见,它只返回第二个输入字段

我的代码有什么问题???

【问题讨论】:

标签: php html


【解决方案1】:

你必须告诉 laravel 这是一个名字的集合,例如:

<input type="text" placeholder="Bidders Name" name="bidder_name" class="form-control">

应该是这样的:

<input type="text" placeholder="Bidders Name" name="bidder_name[]" class="form-control">

【讨论】:

  • 与 laravel 或集合无关,您需要在请求中将变量作为数组发送。
  • @N69S 我说你必须告诉 lararavel 我不是说它与 laravel 相关:)
【解决方案2】:

您只获得 1 个值的原因是因为您的 HTML 属性具有相同的 name

<input type="text" placeholder="Bidders Name" name="bidder_name" class="form-control">

在上面的name 属性是bidder_name,这对于两行都是相同的。所以你只得到第二行。

你可以像下面这样改变它

<input type="text" placeholder="Bidders Name" name="bidder_name[]" class="form-control">

需要对其他 2 个 HTML 表单元素进行相同的更改。

【讨论】:

    【解决方案3】:

    这与 laravel 无关,这就是 HTTP 请求的工作方式。 这两个输入具有相同的name 参数,因此第二个会覆盖第一个。

    如果您希望同一变量中有多个值,请通过添加括号将其用作表格。

    <input type="text" placeholder="Bidders Name" name="variable_name[]" class="form-control">
    

    【讨论】:

    • 技术上如果你想挑剔的话,它是 PHP 而不是 HTTP... URL/请求可能有类似 ?var=1&amp;var=2&amp;var=3 的东西 - PHP 只会读取 var=3(每个 var 覆盖前一个)而 Perl/CGI 会将其视为一个数组并获取(等效于)var = [1,2,3] - 将 [] 添加到变量名使 PHP 像 Perl 一样工作在这方面。
    • @CD001 从技术上讲,这是一个 HTTP 请求而不是 PHP 请求。花点时间检查 HTTP 协议 (tools.ietf.org/html/rfc2616)。如果您在服务器端使用 PHP/JAVA/C/JS/ASP,这也是同样的请求。浏览器不知道您的代码是什么类型。如果您在浏览器中检查请求,您会看到它正在覆盖值。
    • 我知道这是一个 HTTP 请求 - 这不是我要说的 - HTTP 请求正文将很高兴包含所有变量,例如var=1&amp;var=2&amp;var=3 即使所有变量都具有相同的名称... 然而 服务器上的 PHP 对请求正文的处理方式与 Perl/CGI 不同。在这种情况下,PHP 只会读取 var=3(每个 var 都会覆盖前一个),而 Perl 会将同一变量的多个实例视为一个数组;简而言之,var[]=1&amp;var[]=2&amp;var[]=3PHP 将变量视为数组所必需的……它 不是 Perl/CGI 所必需的。
    • @CD001 我知道,但是如果您阅读 RFC,您会发现 PHP 行为是标准。不仅仅是 PHP 遵循它。 peal/CGI 不符合标准。此外,您可以使用php://input 将整个身体作为原始输入,因此不会阻止它。
    • ...终于找到了,它在 RFC 7578 5.2 中定义 - “具有相同字段名称的表单部分不得合并。” - 定义于 2015 年 7 月,之前没有定义(根据附录 A.)处理具有相同名称的多个字段(所以我上次使用 Perl/CGI 时没有定义它)。如果我错了,我会进行研究以找出我错在哪里! :D(如果我找不到它,我会很烦)
    【解决方案4】:

    还有一个建议,您还可以在数组中定义投标人 ID,例如:

    name="bidder_name[b1]" 或只是name="bidder_name[1]"

    这将帮助您了解哪个索引与您有多个投标人的投标人相关。

    示例:

    <input type="text" placeholder="Bidders Name" name="bidder_name[b1]" class="form-control">
    

    <input type="text" placeholder="Bidders Name" name="bidder_name[1]" class="form-control">
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-27
    • 2016-11-18
    • 2021-08-02
    • 1970-01-01
    • 1970-01-01
    • 2021-04-24
    • 1970-01-01
    相关资源
    最近更新 更多