将复选框数组传递给$ _GET的另一种方法 - 除了方括号

时间:2016-02-28 06:39:32

标签: javascript php jquery arrays checkbox

据我所知,如果我使用name []的复选框值,那么我将在服务器上收到一个数据数组(使用PHP时),名为' name []'。这对我来说很好,但我遇到了一些URL大小,可能导致IE浏览器不太健壮的问题,并且所有编码的方括号都在这个区域杀了我,很容易导致URL长度至少为4如果可以采用其他方式,则比可能的长6倍。是否有一种可靠的方法使用javascript(jquery语法甚至更好)拦截复选框形式值并将它们转换为如下所示:

"&安培; checkboxarray = 1-23-45-13-67"

我认为另一方面我可以很容易地将$ _GET [' checkboxarray']分解为一个实际的数组,然后像往常那样将选择数组与选项数组匹配等。 ..我只是不知道是否可能或如何创建更改提交过程。

旁注,没有通过" name []"到一个不符合标准的URL呢?我使用过的每个浏览器都会对它进行自动编码,但不会对Mozilla进行编码,但它似乎运行良好。

编辑:我需要创建分页链接,这就是我使用GET而不是POST的原因。这也是工业搜索,非常全面,很多电力用户选择。

更新&答:我设法得出了自己的答案。对于其他想要利用$ _GET的简易分页工作流程而又需要传递大型数据阵列而又担心URL长度的人来说,这里有一种简单的方法可以将所有内容压缩成一个带有破折号的变量分隔值:

注意:我 HIGHLY 建议您首先确保从查询生成的任何动态数组以1开头而不是0如果您要在提交后重新检查值,这里是如何,因为0可以在PHP条件语句中使用是一个真正的痛苦:

$your_array= array();

array_unshift($your_array,'');
unset($your_array[0]);

在您的HTML代码中,将所有复选框输入名称设置为"某些内容[]"在这组输入下面,创建一个名为""的隐藏输入,我建议你让它们匹配,但我想你可以使用另一个名字,只是确保隐藏的那个缺少方形括号,还将隐藏的输入值设置为"":

<input type="text" name="something[]" value="1">
 .....
<input type="text" name="something[]" value="20">
<input type="hidden" name="something" value="">

Javascript:注意,需要jquery ...这可以抓住所有&#34;某些东西[]&#34;输入值并形成一个虚线数组,同时消除&#34;某些东西[]&#34;提交的价值仅提交&#34;某事&#34;。

$('#submitbutton').click(function(){

      var searchIDs = $('input[name="something[]"]:checked').map(function(){
      return $(this).val();
      }).get(); 

     var IDstring = searchIDs.toString();
     var newvar = IDstring.replace(/,/g, '-');
     $('input[name="something"]').val(newvar);
     $('input[name="something[]"]:checkbox').prop("checked", false);


   });

在服务器端,只需爆炸“&#39;来自$ _GET的价值。

$somethingArray = explode('-',$_GET['something']);

它就是!希望它可以帮助将来的GET发送阵列更加紧凑。奖励:避免在URL中发送不安全的字符,Mozilla似乎不会自动编码方括号,至少在Linux Mint上不是我的版本;)

更新

我刚刚在一个大的国家/地区复选框表单上实现了此代码,其中包含284种可能的选项。使用我的旧代码,甚至使用&#39; c []&#39;作为名字,我的角色数大约是3100个字符,采用新的方法,我的角色数现在只有1109。值得努力。

1 个答案:

答案 0 :(得分:0)

您可以使用POST代替GET方法。

GET有网址长度限制。

POST在传递长数据时很有用,例如在你的情况下一个数组。

POST方法的默认限制为2MB,高于GET。如果需要,可以在php.ini文件post_max_size 10MB中轻松增加。

$_GET替换为脚本中的$_POST