将复选框数组传递到 $_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
。
- jQuery:使用substr()的另一种方法
- 如何访问对象's成员通过另一种方法填充的方法
- 检查窗口是否为弹出窗口的另一种方法
- 将某些内容写入控制台的另一种方法,然后控制台.log
- 从同一控制器 Angularjs 中的另一种方法访问$scope变量
- 另一种在PageLoad上使对象的定时淡入效果的方法
- 修改 yii.activeForm 是个好主意吗.js如果不是,另一种方法是什么
- 将复选框数组传递到 $_GET 的另一种方法 - 除了方括号
- 指南针/咖啡可以做到这一点吗?另一种方法
- 另一种在javascript中创建随机动态url的方法/阻止wpengine缓存
- 为什么在Lightswitch中堆叠承诺的一种方法有效,而另一种方法则不起作用
- 获取数组 Javascript 的所有整数组合的另一种方法
- Don'我不明白为什么这个JavaScript函数可以用一种方法调用,而不能用另一种方法
- 具有自身内在价值的对象.另一种做getter的方法
- 如何在生成响应后,用另一种方法从ajax请求中获取响应
- 另一种方法是让chrome、IE 8和firefox提交相同的表单
- 正在寻找另一种方法来进行isNaN测试
- 如何使用javascript在另一种方法中访问数组
- 用jquery预处理html的一种方法有效,但为什么另一种方法无效't
- 另一种防止垃圾邮件的方法