У меня есть textarea в форме, которую я пытаюсь отправить через ajax с помощью jQuery. Моя проблема в том, что в 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 не работает с обоими случаями с синтаксической ошибкой .
Итак, как я могу отправить текстовые данные, содержащие строки и амперсанды с помощью 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;
если ваш текст сохранен в переменной textareaText, сделайте это
var val = textareaText.replace('&', '__and__');
отправьте это как ajax
и на стороне сервера
если ваше значение json_decode`d сохраняется в переменной с именем $ data, выполните следующие действия:
$val = str_replace( '__and__', '&', $data['value'] );
таким образом вы сможете сохранить амперсанды, не допуская неудачи json_decode
вы можете использовать что-то другое вместо того,
хотя это путает, почему он ломается.
Я не уверен, какова должна быть форма вашего объекта, но это работает для меня, если я изменюсь:
{"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);
Это говорит о том, что & не ваша проблема, но [].