V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
alex321
V2EX  ›  PHP

今天前端和我提了个严肃的问题,关于 PHP 获取 html 的表单数组

  •  1
     
  •   alex321 · 2016-01-25 11:12:51 +08:00 · 5410 次点击
    这是一个创建于 2985 天前的主题,其中的信息可能已经有所发展或是发生改变。
    话说,我一直以来都是用 php 来做公司微信公众号平台的,在图文素材中我是用了类似如下的表单:

    <input type="text" name="Title[]" class="form-control" placeholder="标题" />
    <input type="text" name="Description[]" class="form-control" placeholder="摘要" />
    <input type="text" name="PicUrl[]" class="form-control" placeholder="图片地址" />
    <input type="text" name="Url[]" class="form-control" placeholder="跳转地址" />

    然后,前端和我说,最讨厌这种包含 [] 的表单数组设计了,这个是 PHP 作为后端时前端表单中独有的,虽然现在 ASP.NET 也可以兼容获取到,比如通过: http://stackoverflow.com/questions/4561686/handling-arrays-of-html-input-elements-with-request-form-like-php
    正常在 C# 中可以直接重复 name=Title ,然后 post 或者 get 到后端时会自动变成 Title1=1&Title2=2&Title3=3 这样的形式。
    然后,前端严肃地说,在他看过的书中,有指出过这个是 PHP 当时的设计失误。

    那个,我就偶尔玩一下 PHP ,想问下这个是否确实是 PHP 独有的,甚至是 PHP 当初的设计失误呢?两者我觉得是同一个意思,如果强迫一个语言 A 为另一个语言 B 而改变或者新增一些特性,可能对 A 算是功能上的完善或者补充,但对 B 可能就算是设计上的不完善了吧。

    PS ,此贴仅限 html 数组表单的处理讨论,是否是当时 html 专门为了兼容 PHP 后端获取而做了调整,没有什么引发圣战的意思。
    33 条回复    2016-02-10 17:57:55 +08:00
    moro
        1
    moro  
       2016-01-25 11:18:13 +08:00
    这是 php 特有的。
    moro
        2
    moro  
       2016-01-25 11:19:11 +08:00
    同事说 java 也是这样玩的。
    zwh8800
        3
    zwh8800  
       2016-01-25 11:35:32 +08:00
    这个确实是 php 特有的,能用 json 就用 json 吧
    magicdawn
        4
    magicdawn  
       2016-01-25 11:44:18 +08:00
    这个其实看后端怎么处理吧~
    例如 Node.js 第三方包 qs, 也是这么玩的 https://github.com/ljharb/qs#parsing-arrays
    DualWield
        5
    DualWield  
       2016-01-25 11:50:21 +08:00
    问题是如果是 checkbox 类型的 input 呢? name 必须是 XXX[] 吧
    alex321
        6
    alex321  
    OP
       2016-01-25 11:55:25 +08:00
    @moro java 也这么玩过么?
    @zwh8800 我最终也是格式化到 json 的。。
    @magicdawn 是的,这应该就是其他语言为 html 这个特别为 PHP 适配的特性做的匹配。
    @DualWield checkbox 也和 input 差不多,大致如下。

    <input name="wechatFeature[]" value="wifi" type="checkbox"/>&nbsp;&nbsp;WiFi 上网
    <input name="wechatFeature[]" value="officer" type="checkbox" checked/>&nbsp;&nbsp;客服
    eoo
        7
    eoo  
       2016-01-25 11:56:43 +08:00 via Android
    一般你这种方式只用在 checkbox 类型的 input
    dapang1221
        8
    dapang1221  
       2016-01-25 12:05:00 +08:00
    没用过这么蛋疼的方法,向来都是 ajax 一段 json ,然后返回一个跳转地址。一来用户体验会好,二来就是项目里任何一个人被外星人抓走了,都能立即找到人接替……
    iugo
        9
    iugo  
       2016-01-25 12:05:10 +08:00
    PHP 可以不用 `[]` 获取提交过来的数组.

    用 php://input 看一下就知道了.
    x537196
        10
    x537196  
       2016-01-25 12:08:37 +08:00   ❤️ 1
    java 新手表示暂时没有见过有人这样用
    marvinwilliam
        11
    marvinwilliam  
       2016-01-25 12:10:26 +08:00
    = = java 后端跟我说接不到这样的数组,然后我就把数组改成字符串给他们了。。。
    okampfer
        12
    okampfer  
       2016-01-25 13:26:54 +08:00
    @dapang1221 你的意思是把 html form 格式化为 json 然后再发送给服务器?
    alex321
        13
    alex321  
    OP
       2016-01-25 13:33:32 +08:00
    @iugo 刚测试过了。

    <form action="/welcome/formTest.html" method="post" accept-charset="utf-8">
    <input type="text" name="testName" value="" />
    <input type="text" name="testName" value="" />
    <input type="submit" value="提交" />
    </form>

    给出结果是如下。
    testName=1&testName=2

    谢谢。
    slixurd
        14
    slixurd  
       2016-01-25 13:47:26 +08:00
    Java 确实可以这么玩,而且还很普遍
    例如在 SpringMVC 的 Controller 中:
    getList(HttpServletRequest request, @RequestParam(value = "list[]", required = false) Long[] list)
    okampfer
        15
    okampfer  
       2016-01-25 13:50:12 +08:00
    @alex321 请问你是怎样把 form 格式化为 json 数据的呢?用的是什么前端框架或者工具呢?
    alex321
        16
    alex321  
    OP
       2016-01-25 14:05:44 +08:00
    @okampfer 我木有直接格式化 form 为 json 哦,是 @dapang1221 童鞋。
    我一般都直接用 $('#form').serialize(),要么 jQuery 的 serializeArray 你试下。。
    alex321
        17
    alex321  
    OP
       2016-01-25 14:07:53 +08:00
    @x537196
    @slixurd
    @moro
    Java 我完全不懂唉。
    virusdefender
        18
    virusdefender  
       2016-01-25 14:19:15 +08:00
    公司前端也有这么用的,后端 django 就没法解析,得手动的去取数据,明明可以用 json
    ugg
        19
    ugg  
       2016-01-25 14:28:13 +08:00
    checkbox 不这么玩还怎么玩?
    slixurd
        20
    slixurd  
       2016-01-25 14:36:14 +08:00
    @alex321 这和语言无关的。这是框架自己的处理。
    例如 Spring 的 WebRequest 就封装了这样的方法:
    /**
    * Return the request parameter values for the given parameter name,
    * or {@code null} if none.
    * <p>A single-value parameter will be exposed as an array with a single element.
    * @see javax.servlet.http.HttpServletRequest#getParameterValues(String)
    */
    String[] getParameterValues(String paramName);
    事实上不管怎么样都能取到数组,不管是不是 array[]这样的键名。就只是对一个 key 取多次值而已。
    其它语言的其它框架要处理也不是什么难事,大不了封装一下。
    至于 JSON ,除非复杂对象,不然实在没什么必要用 JSON 。
    iyaozhen
        21
    iyaozhen  
       2016-01-25 14:42:47 +08:00
    关键是你 input 不是这样玩的吧。 name="title" 不就行了,楼主还是比较超前呀。我一开始压根就不知道数组这种用法 2333
    bk201
        22
    bk201  
       2016-01-25 14:46:34 +08:00
    java 可以这样玩,也可以类似 c#这样玩。但是这不应该是前端自己的问题么,非要用 name 表单提交。
    moro
        23
    moro  
       2016-01-25 14:50:33 +08:00
    @slixurd php 自带解析[]作为数组。
    Tr0y
        24
    Tr0y  
       2016-01-25 15:20:50 +08:00
    楼上各位,这不是什么后端语言特有的,这是 w3c 制定的 web 页面提交多维数据的格式(也就是数组),理论上所有的后端环境都可以获取的到。
    ppwangs
        25
    ppwangs  
       2016-01-25 15:25:51 +08:00
    我们 java 用框架的时候都是这样:
    <input type="text" name="entity[0].title" class="form-control" placeholder="标题" />
    <input type="text" name="entity[0].description" class="form-control" placeholder="摘要" />
    <input type="text" name="entity[0].url" class="form-control" placeholder="跳转地址" />

    <input type="text" name="entity[1].title" class="form-control" placeholder="标题" />
    <input type="text" name="entity[1].description" class="form-control" placeholder="摘要" />
    <input type="text" name="entity[1].url" class="form-control" placeholder="跳转地址" />

    这样 server 段处理的时候可以获取到一个 entity 的数组。
    zhujinliang
        26
    zhujinliang  
       2016-01-25 15:40:57 +08:00
    @Tr0y 有相关网址么?

    我一直以为是 php 特有的,因为 php 语法允许 $foo[] = 'bar' ,相当于 array_push($foo, 'bar')
    另外这个先后顺序有约定么?依据文档出现先后顺序?
    falcon05
        27
    falcon05  
       2016-01-25 15:43:18 +08:00
    我一直是这么处理的。。。
    wt12312345
        28
    wt12312345  
       2016-01-25 16:37:14 +08:00
    @dapang1221 举四爪同意
    wt12312345
        29
    wt12312345  
       2016-01-25 16:38:08 +08:00
    @alex321 这个也可以直接用于 ajax ,只不过和传输 JSON 调用的方法不一样而已。
    slixurd
        30
    slixurd  
       2016-01-25 18:21:57 +08:00
    @Tr0y
    吓死我了,然后我赶紧去 W3C 找了个 HTML5 标准看看。
    少年你在哪看的 W3C 规范?为什么和我看的不一样
    Successful controls have exactly one value, except for select controls and file upload controls, which have zero or more values depending on how many items or files they have selected.

    http://dev.w3.org/html5/web-forms-2/
    v1024
        31
    v1024  
       2016-01-25 18:59:13 +08:00 via iPhone
    如果不是为了 noscript 环境,还是异步提交数据吧。
    xiamingchong
        32
    xiamingchong  
       2016-01-26 09:50:54 +08:00
    这跟 php 有毛关系,任何语言都从标准输入都可以读到,怎么解析都行
    klgd
        33
    klgd  
       2016-02-10 17:57:55 +08:00
    post 一个数组表单 不这么用要怎么用?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3453 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 11:10 · PVG 19:10 · LAX 04:10 · JFK 07:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.