2013-02-06 46 views
0

假設我在JavaScript中有這個對象,構建這樣的:傳遞JavaScript對象與支架的關鍵PHP

var obj = {}; 
var fields = ['table_name[field_name]', 'tale_name[field_name_2]'] 

for(var i; i < fields.length; i++){ 
    obj[fields[i]] = someBulkOfData; 
} 

在控制檯登錄時,OBJ將輸出

{ 
    table_name[field_name] : {...}, 
    tabke_name[field_name_2] : {...} 
} 

該作品一切都好,直到我通過jQuery.ajax()通過PHP傳遞對象。

當我收到我的PHP請求,數組看起來如下:

[ 
    ['table_name[field_name'] => ..., 
    ['table_name[field_name_2'] => ... 
] 

所以這裏所發生的是什麼地方在PHP中,最後方括號發送AJAX請求和接收的數據之間每個鍵都消失。

有人可以向我解釋爲什麼會發生這種情況,如果有一個簡單的方法來解決這個問題?

我有一個解決方案的標準,那就是我不能改變鍵(如'table_name \ [field_name \]'之類的東西)。

+0

爲什麼你不能更改密鑰? – Cerbrus

+0

你是什麼意思'用PHP接收我的請求'?請詳細說明一下。 – Lighthart

+0

你如何編碼和解碼?我用'JSON.stringify'和'json_decode()'來測試它,那些處理鍵很好。它是一個GET請求?如果你顯示你的'$ .ajax()'調用可能會有幫助。 –

回答

0

的解決方案是,得益於@fab,將數據與JSON編碼:

$.ajax({ 
    data : { 
     obj:JSON.stringify(obj) 
    }, 
    ... 
}); 

在PHP:

json_decode($_REQUEST['obj']); 

這將輸出一個完美漂亮的stdClass的對象,保存密鑰。

0

您可以通過重組你的JS對象解決這個問題:你避免怪異的命名約定

{ 
    table_name : { 
    field_name_1 : {...}, 
    field_name_2 : {...} 
    }, 
    another_table : { 
    ... 
    } 
} 

這樣。

此外,我懷疑你是從我們這裏隱藏的東西。這和PHP之間有一些(操作),也許在你的AJAX代碼的某處,你不告訴我們。也許你正在將這個對象序列化爲一個字符串並將該字符串作爲一個查詢參數傳遞給服務器。這個序列化步驟可能是原因。

但是可以肯定的是,您可以檢查調試器的Net部分,並檢查請求標頭,如果發送的數據格式完美。

據我所知,jQuery.ajax接受一個JS對象作爲數據,並將其完美地轉換爲查詢字符串。由此,你不需要手動序列化它。

+0

啊,你懷疑是對的!我隱藏了很多。它是更大框架的一部分,上面輸入的代碼僅僅是一個例子。我不能告訴你整個過程,因爲這需要一些頁面;;)淨部分中顯示的請求將括號轉換爲%5B和%5D。我去了fab的解決方案,並將對象編碼並編碼爲JSON,這看起來可行。但是我發現它很奇怪,但是我無法通過$ .ajax傳遞一個沒有編碼它的對象。 – Rinux

1

你試過用$.serialize()嗎?

使用連載把一個javascript的對象,可以使用AJAX容易地發送的串 - 這樣的:

var ajaxableString = $(obj).serialize();