PHP中编码数组的问题

菲菲

我在解析包含数组的get变量并使用jquery ajax发送它时遇到问题。

我发送的数组如下所示

ids%5B%5D   1403172219
ids%5B%5D   1530542001
ids%5B%5D   1582588379

但是当我尝试dump($_GET['ids])时,我得到的是空值,这$_GET比看起来要愚蠢

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();
        }              
    }
}

在本地主机上,我使用PHP 5.4,在Live Server ubuntu PHP 5.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);
});
埃里亚斯·范·奥特格姆(Elias Van Ootegem)

您的实时服务器可能是启用了IPv6的主机。这意味着[and ](或%5Band %5D)是保留字符。encodeURI,它应用于您的字符串化请求字符串,不能,或者不能正确编码这些字符,就像&并且=没有被编码一样。
我认为这里的问题是您在服务器上安装的PHP版本(或suhosin)。我是根据此错误报告做出此假设的,其中一个答复指出以下内容:

我刚刚从PHP 5.3(带有suhosin 0.9.33)更新到PHP 5.5(没有suhosin),这解决了这个问题。我猜想suhosin中的一些安全问题可能是导致我出现旋转图标问题的原因。

我可以切换回PHP 5.3并删除suhosin模块以进一步研究此问题,但是我认为公众利益可能不会太高,因为我似乎是唯一报告此问题的案例。:-)

验证您的服务器是否已安装suhosin,并phpinfo()在两台服务器上进行检查,这应该可以对其进行修复。
另外,您可以选择为此使用jQuery,并编写自己的XMLHttpRequest,并encodeURI(stringifiedObject).replace(/%5B/g, '[').replace(/%5D/g,']');在发送数据之前添加一个

有关IPv6的更多详细信息:关于MDN

如果您不愿意放弃jQ,则临时的解决方法/修复可能是修复请求服务器端:

$post = http_get_request_body();//requires http extension
$post = str_replace(
    array('%5B', %5D'),
    array('[',']'),
    $post;
);

然后使用parse_str,您可以构造$_POST数组:

parse_str($post, $_POST);

那应该为您提供所需的阵列。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章