2011-05-03 58 views
2

我有一些複選框以數組形式發送到服務器。通常,我有這些複選框的列表,並通過數組[]發送它。使用AJAX發送數組的最佳策略

例如,提交本:

<input type="checkbox" class="linkStyle" name="style[]" value="1" checked="checked" /> 1 
<input type="checkbox" class="linkStyle" name="style[]" value="2" checked="checked" /> 2 
<input type="checkbox" class="linkStyle" name="style[]" value="3" checked="checked" /> 3 

我會向服務器發送這些參數:

style[]=1 
style[]=2 
style[]=3 
服務器端

,使用PHP,我可以用$ _ POST [此陣'style'](它將這些參數自動放入數組中);

現在,用AJAX請求來做這個場景有點奇怪,因爲使用函數serialize(),例如我沒有得到相同的結果:事實上,它將單個變量放入整個字符串中,它不會將主題值作爲不同的參數發送。

參照示例之前,將發送出頭像:

style: style%5B%5D=Style1&style%5B%5D=Style2&style%5B%5D=Style3 

,這是上PHP不舒服,因爲它不創建此值的數組。 所以我做了我自己的腳本來模擬這種行爲。如:

var styles=""; 
$('.linkStyle:checked').each(function(i,el){ 
    styles=styles+'style[]='+$(this).val()+'&'; 
}); 

$.ajax ({ 
    url: "list/browse_ajax.php", 
    type: "POST", 
    data: styles+'&id=browseUpdate&actualArtist='+browseArtist+'&actualEvent='+browseEvent+'&actualDate='+browseData, 
    success: function(data) { 
     $('#browseList').html(data); 
    }, 
    error: function(data) { 
     $('#browseList').html("Error"); 
    } 
}); 

現在,想什麼我知道,就是:

  1. ,你怎麼看待這一戰略?
  2. 創建JSON對象並在客戶端/服務器端(內存,處理,計時,資源等)管理它會更好嗎?
  3. 爲什麼對於像這樣的東西,我應該創建一個對象,將其轉換爲json,在php上解碼它,管理結果,將其轉換爲json並重發?我只能管理一個字符串...
  4. 只有PHP或其他語言服務器端(如ASP?)自動創建具有相同名稱和[]的參數列表中的數組?

希望我的問題是不夠理解:)

回答

3

我認爲你在JSON的正確軌道上,這是最有意義的。

  1. 序列化形式JSON(Serializing to JSON in jQuery
  2. POST是通過AJAX JSON字符串
  3. 然後http://php.net/manual/en/function.json-decode.php

另見Convert form data to JavaScript object with jQuery(這兩個SO問題包含有價值的鏈接庫&插件)

編輯

至於你的問題:

,你怎麼看待這一戰略?

您的示例顯示?我假設你已經測試它&它的工作原理。如果它模仿你期望的行爲,我認爲它很好。它要求你不重寫任何你的PHP,這是你顯然感覺舒適的東西。這些都是好處。但是,如果你的工作明智,將表單輸入編碼爲JSON並使用json_decode具有相同的效果,理論上在您解碼JSON之後編寫PHP的方式對您的要求幾乎沒有什麼變化。

創建JSON對象並在客戶端/服務器端(內存,處理,計時,資源等)管理它會更好嗎?

我不能說話的內存等我不希望它是性能不好處理服務器端的JSON對象。這樣的問題通常不是一個簡單的答案,因爲它依賴於太多的其他事情。

爲什麼對於像這樣的東西,我應該創建一個對象,將它轉換爲json,在php上解碼它,管理結果,在json上轉換它並重發?我只能管理一個字符串...

發生了什麼事在你的榜樣,而不JSON(嚴格意義上):

  • 瀏覽器獲取輸入,編碼成一個GET請求字符串
  • 使包含字符串
  • PHP的GET請求訪問GET字符串,允許您將其作爲數組引用

在您的示例中使用JSON會發生什麼(再次,l oosely說):

  • 你的JavaScript需要輸入,其編碼爲JSON
  • 使包含字符串
  • PHP訪問GET字符串(或POST數據),讓您有一個GET(或POST)請求引用它作爲一個數組
  • 您使用json_decode在陣列關鍵之一將其轉換成一個PHP對象

你措辭它的方式給了我,你認爲使用JSON是增加了很多額外的印象腳步。我認爲增加的複雜性在很大程度上是虛構的。 (根據你選擇如何將表單輸入序列化成JSON,事實上它可能實際上只是一個JSON有效的字符串,直到你用PHP解碼爲止。)

選擇處理可能會有未來的好處始終是相同的JSON對象。試想一下,在JSON來回發送的驗證信息發回&,例如...

只有PHP或其他語言進行服務器端(如ASP?)自動創建具有相同的名稱和[]參數列表中的數組?

我不知道我理解這個問題,但我會回答如何與一個GET字符串一種語言優惠編碼:

<input name="style[]" /> 
<input name="style[]" /> 
<input name="style[]" /> 

將是唯一的語言。我之前已經處理過ColdFusion,並且想要類似的東西(根據輸入的名稱構造一個結構體)。但要做到這一點,我不得不通過表單範圍,「重申報」循環,即使它是有效的點語法,例如:

<input name="name.first" /> 
<input name="name.middle" /> 
<input name="name.last" /> 

它不喜歡的JavaScript,例如,應該預計到治療那些輸入就像一個數組。我不記得JavaScript允許您使用此語法填充陣列:

style[] = "red"; 
style[] = "green"; 
style[] = "blue"; 

而PHP確實如此。這不是任何人都在做錯什麼。這是PHP中的一個捷徑。在JavaScript中填充數組的最短方式是不同的。

至於將其轉換爲數組,您不需要在HTTP請求中傳遞數組,PHP可以讓您以數組(或POST數據)的形式訪問GET字符串,而無需您有意識地執行任何操作特殊的......兩個不同的問題。

這實際上是在這裏使用JSON最引人注目的原因,這就是爲什麼其他人說這正是JSON的意義所在。想一想,JSON是「一種輕量級的,與語言無關的,基於文本的開放標準,專爲人類可讀的數據交換而設計。」您可以用JSON表示數組和對象,無論您選擇何種語言,都可以隨時訪問數組和對象。

+0

真棒的答案!謝謝女士;) – kwichz 2011-05-03 22:16:16

3
  1. 要複雜的方法來使用。
  2. 我更喜歡JSON,它使用起來要容易得多,如果你想在某一天改變它,它會容易得多。另外,如果其他程序員需要了解您的代碼,他可能會更好地理解JSON :)
  3. 我不明白這個問題。
  4. 如果您通過郵寄發送數據,應該將其轉換爲大多數語言的數組。

祝你好運!

+0

+1爲推薦使用JSON。這正是JSON的用途。 http://www.php.net/manual/en/ref.json.php – dqhendricks 2011-05-03 20:46:51

+0

編輯了我的3°問題......也許更加全面:) – kwichz 2011-05-03 20:51:22

2

從js發送數組。

var qry = new Object(); 
qry['arg1'] = ... 
qry['arg2'] = ... 
qry['arg3'] = ... 

然後

var jsonqry = 'jsonqry=' + JSON.stringify(arg); 

初始化您的XMLHttpRequest ...

ajax.send(jsonqry); 

用php接收。

$jsonqry = $_POST['jsonqry']; 
$json = json_decode($jsonqry); 

然後,我有$ json-> ARG1等

另一個方向:

在PHP

$a = array(); 
$a['parm1'] = ... 
$a['parm2'] = ... 
$a['parm3'] = ... 


var $rsp = json_encode($a); 
echo $rsp; 
在JS

和背部,在阿賈克斯監聽器:

var rsp = JSON.parse(msg); 

我有

rsp.parm1, etc. 

我認爲這幾乎是傳統的最佳做法,或關閉。

+0

但爲什麼我應該做所有這些操作? (只是檢查我的編輯3°問題嘿嘿) – kwichz 2011-05-03 20:52:58