2014-01-29 33 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'數組? –