Làm cách nào để gửi ký tự “&” (dấu và) qua AJAX?


90

Tôi muốn gửi một vài biến và một chuỗi với POSTphương thức từ JavaScript.

Tôi lấy chuỗi từ cơ sở dữ liệu và sau đó gửi nó đến một trang PHP. Tôi đang sử dụng một XMLHttpRequestđối tượng.

Vấn đề là chuỗi có chứa ký tự &một vài lần và $_POSTmảng trong PHP xem nó giống như nhiều khóa.

Tôi đã thử thay thế &bằng \&bằng replace()hàm, nhưng có vẻ như nó không làm được gì.

Có ai giúp được không?

Mã javascript và chuỗi trông như thế này:

var wysiwyg = dijit.byId("wysiwyg").get("value");
var wysiwyg_clean = wysiwyg.replace('&','\&');

var poststr = "act=save";

poststr+="&titlu="+frm.value.titlu;
poststr+="&sectiune="+frm.value.sectiune;
poststr+="&wysiwyg="+wysiwyg_clean;
poststr+="&id_text="+frm.value.id_text;

xmlhttp.open("POST","lista_ajax.php",true);
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlhttp.send(poststr);

Chuỗi là:

 <span class="style2">&quot;Busola&quot;</span>

Câu trả lời:


170

Bạn có thể sử dụng encodeURIComponent () .

Nó sẽ thoát khỏi tất cả các ký tự không thể xuất hiện nguyên văn trong URL:

var wysiwyg_clean = encodeURIComponent(wysiwyg);

Trong ví dụ này, ký tự dấu và &sẽ được thay thế bằng chuỗi thoát %26, chuỗi này hợp lệ trong URL.


Điều này có đủ để thoát dữ liệu một cách an toàn hay là "vừa đủ" để tránh vấn đề về dấu và?
Wottensprels

@Sprottenwels, nó đủ để mã hóa tất cả dữ liệu một cách chính xác. Bạn hiểu "an toàn" trong ngữ cảnh này là gì?
Frédéric Hamidi


9

Bạn cần url-thoát khỏi ký hiệu và. Sử dụng:

var wysiwyg_clean = wysiwyg.replace('&', '%26');

Như Wolfram đã chỉ ra, điều này được xử lý độc đáo (cùng với tất cả các ký tự đặc biệt khác) bằng encodeURIComponent.


4

Câu trả lời của Ramil Amr chỉ phù hợp với ký tự &. Nếu bạn có một số ký tự đặc biệt khác, bạn nên sử dụng PHP htmlspecialchars() JS encodeURIComponent().

Bạn có thể viết:

var wysiwyg_clean = encodeURIComponent(wysiwyg);

Và ở phía máy chủ:

htmlspecialchars($_POST['wysiwyg']);

Điều này sẽ đảm bảo rằng AJAX sẽ chuyển dữ liệu như mong đợi và PHP (trong trường hợp bạn đưa dữ liệu vào cơ sở dữ liệu) sẽ đảm bảo dữ liệu hoạt động như mong đợi.


2

Bạn có thể chuyển các đối số của mình bằng cách sử dụng hàm encodeURIComponent này để bạn không phải lo lắng về việc chuyển bất kỳ ký tự đặc biệt nào.

data: "param1=getAccNos&param2="+encodeURIComponent('Dolce & Gabbana') 

HOẶC LÀ

var someValue = 'Dolce & Gabbana';
data: "param1=getAccNos&param2="+encodeURIComponent(someValue)

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent


1

Bạn có thể mã hóa chuỗi của mình bằng cách sử dụng mã hóa Base64 ở phía JavaScript và sau đó giải mã nó ở phía máy chủ bằng PHP (?).

JavaScript ( Docu )

var wysiwyg_clean = window.btoa( wysiwyg );

PHP ( Docu ):

var wysiwyg = base64_decode( $_POST['wysiwyg'] );

1

Cách ưu tiên là sử dụng thư viện JavaScript như jQuery và đặt tùy chọn dữ liệu của bạn làm đối tượng, sau đó để jQuery thực hiện mã hóa, như sau:

$.ajax({
  type: "POST",
  url: "/link.json",
  data: { value: poststr },
  error: function(){ alert('some error occured'); }
});

Nếu bạn không thể sử dụng jQuery (ngày nay là tiêu chuẩn khá nhiều), hãy sử dụng encodeURIComponent .


0
encodeURIComponent(Your text here);

Điều này sẽ cắt bớt các ký tự đặc biệt.


Điều này không có thêm bất kỳ giá trị cho các câu trả lời ở trên
Ivan Kaloyanov
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.