php中编码数组的问题

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.

我在解析包含数组的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.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