php中编码数组的问题
我在解析包含数组的get变量并用jqueryajax发送它时遇到了问题 我发送的数组可以如下所示php中编码数组的问题,php,parsing,get,Php,Parsing,Get,我在解析包含数组的get变量并用jqueryajax发送它时遇到了问题 我发送的数组可以如下所示 ids%5B%5D 1403172219 ids%5B%5D 1530542001 ids%5B%5D 1582588379 但是当我尝试转储($\u GET['id])时,我得到空值,我会使这个洞变得比看起来更哑 ids%5B%5D] => 1530542001 JQuery function update_category(selected) { console.
ids%5B%5D 1403172219
ids%5B%5D 1530542001
ids%5B%5D 1582588379
但是当我尝试转储($\u GET['id]
)时,我得到空值,我会使这个洞变得比看起来更哑
ids%5B%5D] => 1530542001
JQuery
function update_category(selected) {
console.log(cids);
$.ajax({
url: '/admin/',
type: 'GET',
dataType: "application/JSON",
data: {
ids: cids,
s_category: selected,
controller: 'products',
traditional: true,
action: 'update_category'
},
success: function(data) {
addAlert('alert-'+data, data);
},
error: function(data) {
addAlert('alert-'+data.responseText, data.responseText);
}
});
控制器
protected function update_category() {
print_r($_GET);
$cat_ids = $_GET['ids'];
$category = $_GET['s_category'];
if(!empty($cat_ids) && !empty($category)){
$this->model->updateCategory($cat_ids, $category);
} else {
echo 'Fähler in der Daten übergabe!';
exit();
}
}
}
在localhost上,我使用PHP5.4,在实时服务器UbuntuPHP5.3.10上,我没有遇到任何问题。错误仍然存在
本地主机上的正确输出
Array (
[ids] => Array (
[0] => B6Q09EA#ABD
[1] => H4P04EA#ABD
)
[s_category] => 4
[controller] => products
[traditional] => true
[action] => update_category
)
ID的构建方式如下所示
cids = [];
jQuery.each(sData, function(key, value) {
cids.push(value.value);
});
您的实时服务器可能是启用IPv6的主机。这意味着
[
和]
(或%5B
和%5D
)是保留字符<应用于字符串化请求字符串的code>encodeURI,不能正确编码这些字符,就像&
和=
没有编码一样。这里的问题是您在服务器上安装的PHP版本(或者可能是suhosin)。我基于此假设,其中一份回复陈述了以下内容: 我刚刚从PHP5.3(使用suhosin 0.9.33)更新到PHP5.5(不使用suhosin),这解决了这个问题。我想suhosin内部的一些安全问题可能是我遇到的旋转图标问题的原因 我可以切换回PHP5.3并删除suhosin模块来进一步调查这个问题,但我认为公众的兴趣可能不会太高,因为我似乎是唯一一个报告有这个问题的案例。:-) 验证您的服务器是否安装了suhosin,并检查两台服务器上的
phpinfo()
,这应该可以修复它。或者,您可以选择不为此使用jQuery,编写自己的
XMLHttpRequest
,并添加encodeURI(stringifiedObject)代码>发送数据之前
有关IPv6的更多详细信息:
如果您不愿意放弃jQ,临时解决方法/修复可能是修复请求服务器端:
$post = http_get_request_body();//requires http extension
$post = str_replace(
array('%5B', %5D'),
array('[',']'),
$post;
);
然后,您可以构造$\u POST
数组:
parse_str($post, $_POST);
这将为您提供所需的数组。它将只显示最后一个,因为它将替换所有并等于最后一个。请更改索引aur将ID[]作为数组。问题是什么?这种行为是意料之中的。请澄清你想做什么。并显示您的jquery代码。两台机器上的字符编码相同吗?另外,这个输出打印得是否正确?你是指我的元标题吗?似乎你的AJAX正在发送一个JSON编码的字符串,而你的PHP正在等待一个未编码的GET变量?谢谢你的反馈,我将在周一检查它。我希望这是解决办法我的phpinfo在live server上显示我在使用IPv6我一直在禁用IPv6支持,但phpinfo显示了same@fefe:那苏霍辛呢?有人在用它吗?它是否使用http\u get\u request\u body
,而不是使用有缺陷的$\u POST
数组工作?好的,我刚刚升级到php5.4,suhosin没有列在php信息中,但问题仍然存在。由于jQueryAjax的复杂性,我希望避免refactor@fefe:在suhosin上,您不必总是在phpinfo
中显示它。这个扩展的全部思想是安全性,因此它可能存在,但对phpinfo