HTML复选框表单和HTTP URL


HTML checkbox form and HTTP URL

所以,我有这个HTML表单:

<form id="search_form" class="form_wrapp"
    accept-charset="utf-8" method="get" action="http://testing.com/results">
    <input class="inputbox" type="text" name="search_query">
    <input class="ic_search" type="submit" value="">
    <input type="checkbox" value="checkbox1" name="search_filter[]">
    <label for="Checkbox1">Checkbox1</label>
    <input type="checkbox" value="checkbox2" name="search_filter[]">
    <label for="Checkbox2">Checkbox2</label>
</form>

并在提交时重定向到此URL,同时选中的2个复选框

results?search_query=dreams&search_filter[]=checkbox1&search_filter[]=checkbox2

它是这样工作的(在codeigniter中,我使用$this->input->get('search_filter')获取数据),但我的问题是:我在表单中做了一些错误的事情,或者这就是它应该如何工作的?我的意思是:&search_filter[]=checkbox1&search_filter[]=checkbox2。它不应该是类似于:&search_filter[]=checkbox1,checkbox2吗?如果没有,我怎么能让它这样工作?

如果您想要逗号格式,可以执行以下操作:

$filters = (array) $this->input->get('search_filter');
$filters = implode(',',$filters);

如果您想更改表单提交的格式,假设jquery for js:

$('#search_form').submit(function() {
   var $hidden = $('<input type="hidden" name="search_filter" />').appendTo($(this)),
       $filters = $('input[name^=search_filter]'),
       value = '';
      //loop through the filters check if there checked and add them to the value
      $hidden.val(value);
      $filters.remove();       
});

当然,如果用户没有启用js,它将以本机方式提交

我是在表格里做错了什么,还是应该这样做?

这就是它应该如何工作。至少,如果您需要用PHP读取查询字符串,那么这些括号需要在那里读取整个查询字符串,而不会让下一个值覆盖每个search_filter值。

如果没有,我怎么能让它这样工作?

如果必须,您可以使用POST请求,处理提交,并使用所需的任何查询字符串重定向到您选择的URL。

根据您的评论:

我想把这个网址做成&search_filter[]=checkbox1,checkbox2,只是为了让它更"漂亮"一点

别担心,说真的。唯一重要的是当你在做极端的SEO时,你不希望两个URL指向同一个地方。在这些情况下,通常的做法是删除所有未使用的键并按字母顺序排列,以便所有带有查询字符串的URL都是一致的,但将它们篡改成自定义的东西仍然不是其中的一部分。

除此之外,不要反对这种行为-使用它来处理-它不会"坏掉",让它"漂亮"对任何人来说都无关紧要,而且你必须猜测/记住哪些页面以正确的方式处理查询字符串,哪些页面使用你的"自定义"方法。

我在表单中做错了什么,或者这就是它应该如何工作?

应该就是这样工作的

不应该是这样的吗;search_filter[]=checkbox1,checkbox2?

然后你就分不清两个项目和一个有逗号的项目之间的区别了

如果没有,我怎么能让它这样工作?

引人注目的JavaScript。不要那样做。表单的工作方式很好。

这很正常。表单数据总是以key=value对的形式发送,只有一个值。提交key=value,value不是HTTP规范的一部分,并且会将这些值视为一个单独的字符串,而不是两个逗号分隔的值。

你当然可以使用一些JS来动态重建你的表单,以使用value,value格式,但你也必须修改你的服务器端脚本来接受这种新格式。PHP不会在您之前自动拆分值,因为它不是标准表示。

&search_filter[]=checkbox1,checkbox2

你为什么需要这个?

像这样使用:

<?php
$searchFilter = $this->input->get('search_filter');
foreach($searchFilter as $filter)
    // some actions with filters.

search_filter[]是一个简单的数组,包含来自复选框输入的值。