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

2016-01-25 11:12:51 +08:00
 alex321
话说,我一直以来都是用 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 后端获取而做了调整,没有什么引发圣战的意思。
5441 次点击
所在节点    PHP
33 条回复
moro
2016-01-25 11:18:13 +08:00
这是 php 特有的。
moro
2016-01-25 11:19:11 +08:00
同事说 java 也是这样玩的。
zwh8800
2016-01-25 11:35:32 +08:00
这个确实是 php 特有的,能用 json 就用 json 吧
magicdawn
2016-01-25 11:44:18 +08:00
这个其实看后端怎么处理吧~
例如 Node.js 第三方包 qs, 也是这么玩的 https://github.com/ljharb/qs#parsing-arrays
DualWield
2016-01-25 11:50:21 +08:00
问题是如果是 checkbox 类型的 input 呢? name 必须是 XXX[] 吧
alex321
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
2016-01-25 11:56:43 +08:00
一般你这种方式只用在 checkbox 类型的 input
dapang1221
2016-01-25 12:05:00 +08:00
没用过这么蛋疼的方法,向来都是 ajax 一段 json ,然后返回一个跳转地址。一来用户体验会好,二来就是项目里任何一个人被外星人抓走了,都能立即找到人接替……
iugo
2016-01-25 12:05:10 +08:00
PHP 可以不用 `[]` 获取提交过来的数组.

用 php://input 看一下就知道了.
x537196
2016-01-25 12:08:37 +08:00
java 新手表示暂时没有见过有人这样用
marvinwilliam
2016-01-25 12:10:26 +08:00
= = java 后端跟我说接不到这样的数组,然后我就把数组改成字符串给他们了。。。
okampfer
2016-01-25 13:26:54 +08:00
@dapang1221 你的意思是把 html form 格式化为 json 然后再发送给服务器?
alex321
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
2016-01-25 13:47:26 +08:00
Java 确实可以这么玩,而且还很普遍
例如在 SpringMVC 的 Controller 中:
getList(HttpServletRequest request, @RequestParam(value = "list[]", required = false) Long[] list)
okampfer
2016-01-25 13:50:12 +08:00
@alex321 请问你是怎样把 form 格式化为 json 数据的呢?用的是什么前端框架或者工具呢?
alex321
2016-01-25 14:05:44 +08:00
@okampfer 我木有直接格式化 form 为 json 哦,是 @dapang1221 童鞋。
我一般都直接用 $('#form').serialize(),要么 jQuery 的 serializeArray 你试下。。
alex321
2016-01-25 14:07:53 +08:00
@x537196
@slixurd
@moro
Java 我完全不懂唉。
virusdefender
2016-01-25 14:19:15 +08:00
公司前端也有这么用的,后端 django 就没法解析,得手动的去取数据,明明可以用 json
ugg
2016-01-25 14:28:13 +08:00
checkbox 不这么玩还怎么玩?
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 。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/253147

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX