2014-01-29 31 views
1

我有问题来解析包含数组的一个get变量并用jquery ajax发送它。编码数组在php中的问题

数组我送可以看看,因为它遵循

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

但是当我试图转储($_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,我不面对直播服务器Ubuntu的PHP 5.3.10任何问题的错误依然存在

在localhost

Array ( 
[ids] => Array (
    [0] => B6Q09EA#ABD 
    [1] => H4P04EA#ABD 
    ) 
[s_category] => 4 
[controller] => products 
[traditional] => true 
[action] => update_category 
) 

正确的输出ids被建造成像

cids = []; 
jQuery.each(sData, function(key, value) { 
     cids.push(value.value); 
}); 
+0

它只会显示最后一个,因为它会替换所有并等于最后一个请更改索引aur make ids []作为数组 –

+0

问题是什么?这种行为是预期的。请澄清你想要做什么。并向我们​​展示您的jQuery代码。 – Happy

+0

两台机器上的字符编码是否相同?另外,该输出是否正确打印在SO上? – krowe

回答

2

你的l Iive服务器可能是支持IPv6的主机。这意味着[](或%5B%5D)是保留字符。 encodeURI,应用于您的字符串化请求字符串,不,或者不能正确编码这些字符,就像&=未编码。
这里的问题是你的服务器上安装的PHP版本(或者也许是suhosin),我想。我提出基于on this bug report这一假设,其中一个反应说明如下:

我刚刚更新从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的事情更多的细节:on MDN

临时解决方法/修复可能是修复请求服务器端,如果你不愿意沟JQ:

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

然后using parse_str,您可以构建$_POST阵列:

parse_str($post, $_POST); 

这应该给你你需要的阵列。

+0

感谢您的反馈我将在星期一检查它。我希望这是解决方法 – fefe

+0

我的phpinfo在实时服务器上显示我在IPv6上我一直禁用IPv6支持,但phpinfo显示相同的 – fefe

+0

@fefe:那么suhosin呢?是被使用?它使用'http_get_request_body'工作,而不是使用有缺陷的$ _POST'数组? –