2011-06-03 97 views
4

我有一個textarea,我試圖通過jQuery與jQuery發送。我的問題是當textarea包含換行符和符號(&)。如何通過包含&符和/或換行符的ajax傳遞textarea數據?

我得到textarea的值用下面的JS代碼:

// Find all the fields with class dirty 
$('#customer .dirty').each(function() { 

    fieldName = $(this).attr('id'); 
    fieldValue = $(this).val(); 

    // Create an object of dirty field names and values    
    var fields = { 'fieldName' : fieldName, 'value' : fieldValue }; 

    // Add the object of field names and values to the custRecordToUpdate array     
    custRecordToUpdate.push(fields); // note: this was initialized before 

}); 


var arrayToSend = { 
    customer : custRecordToUpdate 
}; 

var dataToSend = JSON.stringify(arrayToSend); 

隨着textarea的值,如下所示:

1/8 CLEAR MIRROR 
3/8 CLEAR GLASS 

如果我的console.log(dataToSend),我獲得以下內容:

{"customer":[{"fieldName":"cust_note","value":"1/8 CLEAR MIRROR\n3/8 CLEAR GLASS"}]} 

在PHP腳本上,我json_decode發佈的數據,它工作正常。

如果我再更改文本區域包括一個符號如下:

1/8 CLEAR MIRROR 
3/8 CLEAR GLASS & GLASS 

的json_decode失敗。所述的console.log(dataToSend)顯示以下內容:

{"customer":[{"fieldName":"cust_note","value":"1/8 CLEAR MIRROR\n3/8 CLEAR GLASS & GLASS"}]} 

json_last_error()顯示器語法錯誤

如果更改js代碼以上這樣:

fieldValue = encodeURIComponent($(this).val()); 

然後console.log(dataToSend)顯示:

{"customer":[{"fieldName":"cust_note","value":"1%2F8%20CLEAR%20MIRROR%0A3%2F8%20CLEAR%20GLASS"}]} 

json_decode失敗與兩個數據的情況下與語法錯誤

那麼,如何發送包含換行符和&符號的textarea數據通過ajax到php後端,並讓json_decode不會失敗?

解決方案:基於以下一些意見

,我決定改變發送數據的Ajax代碼,而這個問題解決了,雖然我不知道爲什麼。

無論如何,這裏是代碼,以防萬一它可以幫助其他人。

var returnedHTML = $.ajax({ 
    type: "POST", 
    url: 'index.php/customer/save_edit_customer', 
    //data : "data="+dataToSend, // This is how I was sending it before 
    data : { "data" : dataToSend }, // This is the new code that works! 
    async: false, 
    cache: false 
}).responseText; 
+0

當我在我的PHP安裝(5.3.2-1)上執行'print_r(json_decode($ your_bad_sample_here))'時,我得到了預期的對象。我建議在調用json_decode()之前立即拋出你在PHP端收到的字符串。最有可能的是,你已經有了某些數據,例如magic_quotes等。 – 2011-06-03 16:41:41

+0

@Marc B,這個評論,以及下面的內容讓我想到了我發送數據的方式,而不是關注數據本身。我改變了Ajax代碼,它突然發揮作用。我更新了帖子以反映我所做的更改。所以是的,它看起來像是什麼「啃」數據,但我仍然不確定是什麼... – Julio 2011-06-08 20:05:53

回答

2

假設你的文本保存在變量textareaText做到這一點

var val = textareaText.replace('&', '__and__'); 

發送此作爲Ajax

,並在服務器端

假設你json_decode`d值保存在名爲$ data的變量中執行此操作:

$val = str_replace('__and__', '&', $data['value']); 

這種方式,您將能夠保持與號而不讓您的json_decode未能

你可以用別的東西來代替作爲佔位符

雖然它是混亂,爲什麼它打破。

+0

這是一個解決方法,但並沒有解決根本問題 - Javascript不考慮'&字符串作爲元字符,所以沒有理由json_decode會失敗。別的東西正在夯實OP的數據。 – 2011-06-03 17:01:26

+0

確切地說,有些東西正在改變$ _GET或$ _POST數組,或者在用戶嘗試json_decode那個值之前發生了什麼事情 – shaheer 2011-06-03 17:06:35

+0

最好找出/爲什麼要改變數據,而不是抄紙它用一個字符串操作。不保證它不會將你正在使用的哨兵角色混入其他東西中。 – 2011-06-03 17:22:06

2

我不知道你的物體的形狀應該是,但它爲我工作,如果我改變:

{"customer":[{"fieldName":"cust_note","value":"1/8 CLEAR MIRROR\n3/8 CLEAR GLASS & GLASS"}]} 

{"customer":{"fieldName":"cust_note","value":"1/8 CLEAR MIRROR\n3/8 CLEAR GLASS & GLASS"}} 

即刪除陣列語法來自json對象。

這裏是我的測試...

var customer = {"customer":{"fieldName":"cust_note","value":"1/8 CLEAR MIRROR\n3/8 CLEAR GLASS & GLASS"}}; 
    alert(customer.customer.fieldName); 
    alert(customer.customer.value); 

這表明&是不是你的問題,但[]是。

相關問題