【问题标题】:HTML forms multi-select using GET使用 GET 的 HTML 表单多选
【发布时间】:2011-11-05 04:09:24
【问题描述】:

注意:

这有点难用谷歌搜索,因为“GET”提出了很多“如何使用 javascript '获取'表单的值”等。

问题:

TL;DR 版本优先

您能否在表单的 GET 方法中使用多选并仍检索每个单独的值?

扩展解释

我正在构建的可搜索目录的要求包括对表单使用 GET 方法,以便用户可以在 url 中看到他们的结果,并将搜索结果的直接链接发送给另一个客户等。

其中一个可搜索字段是多选框(带有MULTIPLE 属性的选择框)。我的后端是用 PHP 编写的,我通常通过将名称设置为数组变量 (name="multiselect[]") 来处理多选,而 post 变量包含一个选定选项的数组 ($_POST["multiselect"] == array())

这种情况下的问题是多选值是这样传递给get字符串的:

action?multiselect=1&multiselect=2

因此,无论最后一个值是什么,都会替换 get 字符串中变量的第一次初始化值。 (在上面的例子中,多选等于“2”)。

尝试将名称设为数组只会使数组值以相同的方式替换,就像这样

action?multiselect[]=1&multiselect[]=2

将导致$_GET["multiselect"] == 2

我最初建议使用复选框,因为它允许我们以不同的方式命名元素并检查每个元素的真/假,但是这个特定的多选大约有 30 个值,他们希望它是在可滚动区域中。

【问题讨论】:

  • 为什么不添加隐藏的表单元素并将多选值复制到相应的复选框。用jquery很容易做到。您显然有理由使用“获取”,但请记住 URL 的长度是有限的。你不能通过 URL 本身发送 8K 的数据。
  • 您是否尝试过使用 foreach 循环遍历 post 变量或使用 $_GET["multiselect"] 的大小?
  • 这很好。在任何情况下,限制他们可用的选项子集可能是一个好主意。最初我试图保持这种形式完全可降解(并不是我真的希望迎合那些关闭 JS 的人,但如果有人的 JS 失败或发生任何事情,我们总是会被覆盖)。浏览器通过 GET 发送表单数据的方式让我束手无策吗?
  • 好吧,barryhunter 证明我遇到了另一个问题。但是现在我想到了 Mech,它仍然为表单上的每个输入发送一个空白值。在 JS 之外有没有办法防止这种情况发生以限制 url 大小? (这似乎现在需要成为一个新问题)

标签: php html forms


【解决方案1】:

为我工作。刚试过

http://www.nearby.org.uk/tmp/multi-test.html

<select name="multiselect[]" ...

生成一个 URL ?多选%5B%5D=2&多选%5B%5D=3

这将使 $_GET['multiselect'] 在 PHP 中成为一个数组。

也许你的系统中有其他东西,剥离 [] ?

【讨论】:

  • 这很奇怪,因为当我尝试最初“多选”并没有将 [] 转义为 %5B 和 %5D 时,它只是让它们像服务器一样([])不明白。现在我正在尝试它,它显示了你在说什么,所以让我看看我是否还有其他潜在问题。
  • @NateDSaint,您是否有可能正在调试未更新 [name] 的页面缓存版本?
  • 史诗般的失败就我而言。显然,我的一个 javascript 库在将所有内容发送到服务器之前对其进行了转义。我在没有打开 JS 的情况下进行测试,它只是工作。留下这个问题,这样每个人都可以获得代表,其他人可以找到这个,因为我正在用头撞墙试图用谷歌搜索它。
  • @zzzzBov 这实际上也是问题的一部分,让我没有注意到我在做什么,因为我正在刷新相同的 URL,而不是点击提交并看到浏览器生成一个新的
猜你喜欢
  • 2020-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多