HTML复选框表单和HTTP URL

时间:2012-01-18 13:55:22

标签: php forms url checkbox

所以,我有这个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>

并在提交时重定向到此网址,并选中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?如果没有,我怎么能让它像那样工作?

5 个答案:

答案 0 :(得分:2)

  

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

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

  

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

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

来自你的评论:

  

我想像这样&search_filter[]=checkbox1,checkbox2制作网址,只是为了让它更“美丽”

请不要担心,认真。唯一重要的是当你进行极端搜索引擎优化并且你不希望两个URL指向同一个地方时。在这些情况下,通常的做法是删除所有未使用的密钥并按字母顺序排列它们,以便所有带有查询字符串的URL都是一致的,但将它们分解为自定义仍然不是其中的一部分。

除此之外,不要与行为作斗争 - 用一起工作 - 它不会“破碎”并使其“美丽”对任何人都无关紧要,而且你必须猜测/记住哪些页面以正确的方式处理查询字符串,以及哪些页面使用“自定义”方法。

答案 1 :(得分:2)

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

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

如果要更改表单提交的格式,请假设js的jquery:

$('#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,它将原生提交

答案 2 :(得分:1)

  

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

这就是它应该如何运作

  

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

然后你无法区分两个项目和一个带逗号的项目。

  

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

突兀的JavaScript。不要那样做。表单的工作方式很好。

答案 3 :(得分:1)

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

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

答案 4 :(得分:1)

&search_filter[]=checkbox1,checkbox2

为什么需要这个?

使用它:

<?php

$searchFilter = $this->input->get('search_filter');

foreach($searchFilter as $filter)
    // some actions with filters.

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