2011-05-28 62 views
3

我使用AJAX將一些數據放在我的數據庫中。我正在使用JSON將數據提交到PHP頁面。我正在使用POST請求。你可以將一個POST變量設置爲一個數組嗎?下面我有充分的AJAX請求,但這裏是我設置的數據的兩個部分作爲陣列的一部分:

"content[]" : testContentArray, 
"content_attr[]" : testContentAttributes, 

下面是我的全部AJAX(使用jQuery):

$.ajax({ 
       type: "POST", 
       url: "../includes/create_test_main.ajax.php", 
       data: {"tags" : $('#testTags').val(), 
             "title" : $('#testTitle').val(), 
             "subject" : $('#testSubject').val(), 
             "description" : $('#testDescription').val(), 
             "content[]" : testContentArray, 
             "content_attr[]" : testContentAttributes, 
             "user_id" : user_id}, 
       success: 

            function(testId) {//redirect Page 
             window.location.href = "http://localhost/nvr_forget/public_html/test/" + testId + "/"; 
            } 
      }); 
     }; 

如果那就是實現它的方式,我將如何在PHP端處理它?作爲普通數組處理$ _POST變量?

回答

3

當您將data對象內的數組傳遞給$.ajax時,它將被解析爲name[]=value格式。這是使用$.param完成的,所以我會說明使用:

jQuery.param({'foo': [1, 2, 5]}) 
// "foo%5B%5D=1&foo%5B%5D=2&foo%5B%5D=5" 

%5B%5D是URI編碼的方括號。這是將同一個密鑰的多個值發送到服務器的常用方法。 PHP解析成一個數組,所以在這種情況下:

var_export($_POST['foo']); 
// array ('1', '2', '5') 

因此,在你的代碼,$_POST['content']$_POST['content_attr']都應該是數組。您使用的方括號是不必要的,但不會破壞任何內容。

See the PHP manual on the subject

+0

那麼你將如何循環這些數組? 'while($ _ POST ['content']){/ * do something * /}'? – chromedude 2011-05-28 21:08:06

+2

@chromedude你不能使用'while'來循環訪問一個數組(你可以,但是在幾乎所有可能的情況下它都是愚蠢的)。使用['foreach'](http://php.net/manual/en/control-structures.foreach.php)。 – lonesomeday 2011-05-28 21:09:43

+0

jQuery.param基本上完成了我的解決方案,但就像我說的,你只是使用另一個序列化程序..這很好,我想如果你只是瞎搞:P – Halcyon 2011-05-28 21:13:04

0

當然,你可以 - 它可以是簡單的數組(整數作爲鍵)或關聯數組。它只取決於你提交的JSON對象。

例如,如果你提交以下JSON對象:

var data = { 
    'a': 'test123', 
    'b': [ 
     'x', 
     'y', 
     'z' 
    ], 
    'c': { 
     'testing': 'abc', 
     'blah': 'qwerty' 
    } 
} 

您將有中$_POST以下元素:

  • $_POST['a'] - 包含字符串test123
  • $_POST['b'] - 包含數組( array('x','y','z')),
  • $_POST['c'] - 還含有數組,但關聯(array('testing'=>'abc','blah'=>'qwerty')),
+0

我不認爲這有效。 '$ _POST ['b']'最終會變成''Array''而不是'['x','y','z']' – Halcyon 2011-05-28 20:57:18

+0

@Frits這是因爲你剛剛回應它。你不會像這樣回顯數組(這是PHP初學者中的常見錯誤)。嘗試使用'print_r($ _ POST ['b'])''或'var_dump($ _ POST ['b'])''而不是'echo $ _POST ['b']',你會明白我的意思。 – Tadeck 2011-05-28 21:04:20

+0

回聲會產生與周圍引號的數組?我想不是。請不要假設。我可以輸入「'字符串(5)」數組「'」但現在只是愚蠢的是不是? – Halcyon 2011-05-28 21:24:46

0

您可以發佈從JS(JSON)的對象和json_decode它在服務器上(PHP)與json_decode。

+0

這完全沒有必要。 OP在JS端有JSON,如果他使用jQuery的'.post()'函數,他發送的數據被PHP視爲數組。爲什麼你需要從JS對象構造字符串然後解碼它? – Tadeck 2011-05-28 21:01:55

0

你也許可以做到這一點,但你必須完全手工做它像這樣:

{ 
    "content[0]": "a", 
    "content[1]": "b", 
    "content[2]": "c", 
    "content[multi][0]": "d" 
} 

$_POST['content']然後將看起來像:

Array(
    0 => "a", 
    1 => "b", 
    2 => "c", 
    multi => Array(
     0 => "d" 
    ) 
) 

這將是一個簡單得多,只是:

{ 
    "blob" : JSON.stringify(data_or_array_or_whatever) 
} 

在PHP然後你可以通過檢索:

$data = json_decode($_POST['blob'], true); 

雖然這需要舊版瀏覽器的json2.js庫。

我會爲後者而去,因爲你可能會在最後編寫自己的序列化程序:P - 這正是我們擁有JSON的原因。

+0

@Frits使用jQuery並將數組賦值給JSON對象的一個​​屬性(通過'.post()'方法發送給服務器的對象)不需要JSON stringify(在客戶端)和解碼(在PHP方面),所以不需要額外的庫。 – Tadeck 2011-05-28 21:17:19

+0

那麼爲什麼OP有問題呢?無論如何,我的觀點是,如果你想在不使用jQuery的情況下做到這一點。 – Halcyon 2011-05-28 21:19:52

+1

@Frits因爲他是初學者。但他詢問更多有經驗的人,他期望有人知道如何使用jQuery通過AJAX發送數據。但是,如果你試圖在沒有jQuery的情況下做到這一點,你可能是對的 - 我已經在問題的背景下看到了你的答案。然而,你說他需要json2.js,而不是 - 對他來說可能沒有用或者甚至是合理的(他使用jQuery),但是我會盡快撤銷我的downvote(它現在被鎖定)。 – Tadeck 2011-05-28 21:26:18

相關問題