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


Alternative Way to Pass Checkbox Array to $_GET - Besides Square Braces

我知道如果我使用name[]的复选框值,那么我将在服务器上收到一个名为"name[]"的数据数组(使用PHP时)。这对我来说效果很好,但是我遇到了一些 URL 大小,这可能会导致不太强大的 IE 浏览器出现问题,并且所有编码的方括号都在这个领域杀死了我,很容易导致 URL 长度至少比它可能长 4-6 倍,如果有另一种方式可用。有没有一种可靠的方法使用 javascript(jquery 语法更好)来拦截复选框表单值并将它们转换为如下所示的内容:

"&复选框数组=1-23-45-13-67"

我认为在另一端,我可以轻松地将 $_GET['checkboxarray'] 分解成一个实际的数组,然后从那里开始,就像我通常将选择数组与选项数组匹配一样,等等......我只是不知道是否有可能或如何创建更改提交过程。

旁注,将"name[]"传递给 URL 是不合规的吗?我使用过的每个浏览器都会自动对其进行编码,但不是 Mozilla,但它似乎工作正常。

编辑:我需要创建分页链接,这就是为什么我使用GET而不是POST。这也是和工业搜索一样,非常全面,很多高级用户选择。

更新和答案:我设法想出了自己的答案。对于想要利用 $_GET 的简单分页工作流程但您需要传递大型数据数组并担心 URL 长度的任何其他人,这里有一种简单的方法,可以将其全部压缩到一个带有破折号分隔值的变量中:

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

$your_array= array();
array_unshift($your_array,'');
unset($your_array[0]);
在您的 HTML 代码中,将所有复选框输入名称设置为"something[]",并在这组输入下方,创建一个名称为"something"的隐藏输入,

我建议您使它们匹配,但我想您可以使用另一个名称,只需确保隐藏的缺少方括号,还将隐藏的输入值设置为 ":

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

Javascript:注意,需要jquery...这会抓取所有"something[]"输入值并形成一个虚线数组,同时从提交中消除"something[]"值并仅提交"something"。

$('#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);

   });

在服务器端,只需从 $_GET 中分解"某物"值即可。

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

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

更新:

我刚刚在一个具有 284 个可能选择的大国复选框表单上实现了此代码。使用我的旧代码,即使使用"c[]"作为名称,我的字符数也约为 3100 个字符,使用新方法,我的字符数现在仅为 1109。值得付出努力。

您可以使用

POST而不是GET方法。

GET有 URL 长度限制。

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

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

在脚本中将$_GET替换为$_POST