ฉันจะส่งอักขระ“ &” (ampersand) ผ่าน AJAX ได้อย่างไร


92

ฉันต้องการส่งตัวแปรสองสามตัวและสตริงด้วยPOSTวิธีการจาก JavaScript

ฉันได้รับสตริงจากฐานข้อมูลจากนั้นส่งไปยังหน้า PHP ฉันกำลังใช้XMLHttpRequestวัตถุ

ปัญหาคือสตริงมีอักขระสอง&สามครั้งและ$_POSTอาร์เรย์ใน PHP จะเห็นว่ามันเหมือนกับหลายคีย์

ฉันพยายามเปลี่ยน&ด้วย\&กับreplace()ฟังก์ชั่น แต่ก็ดูเหมือนจะไม่ทำอะไร

ใครสามารถช่วย?

โค้ดจาวาสคริปต์และสตริงมีลักษณะดังนี้:

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);

สตริงคือ:

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

คำตอบ:


171

คุณสามารถใช้encodeURIComponent ()

มันจะหลีกเลี่ยงอักขระทั้งหมดที่ไม่สามารถเกิดคำต่อคำใน URL:

var wysiwyg_clean = encodeURIComponent(wysiwyg);

ในตัวอย่างนี้อักขระเครื่องหมายและ&จะถูกแทนที่ด้วยลำดับ Escape %26ซึ่งใช้ได้ใน URL


นี่เพียงพอที่จะหลบหนีข้อมูลอย่างปลอดภัยหรือ "แค่" เพียงพอที่จะหลีกเลี่ยงปัญหาเครื่องหมายแอมเพอร์แซนด์หรือไม่
Wottensprels

@Sprottenwels ก็เพียงพอที่จะเข้ารหัสข้อมูลทั้งหมดอย่างถูกต้อง คุณหมายถึงอะไร "อย่างปลอดภัย" ในบริบทนี้
Frédéric Hamidi


9

คุณต้อง url-escape the ampersand ใช้:

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

ดังที่ Wolfram ชี้ให้เห็นสิ่งนี้ได้รับการจัดการอย่างดี (พร้อมกับอักขระพิเศษอื่น ๆ ทั้งหมด) โดย encodeURIComponent


4

คำตอบของ Ramil Amr ใช้ได้กับอักขระ & เท่านั้น ถ้าคุณมีบางตัวอักษรพิเศษอื่น ๆ ที่คุณควรใช้ของ PHP htmlspecialchars() และencodeURIComponent() JS ของ

คุณสามารถเขียน:

var wysiwyg_clean = encodeURIComponent(wysiwyg);

และทางฝั่งเซิร์ฟเวอร์:

htmlspecialchars($_POST['wysiwyg']);

สิ่งนี้จะทำให้แน่ใจว่า AJAX จะส่งผ่านข้อมูลตามที่คาดไว้และ PHP นั้น (ในกรณีที่คุณใส่ข้อมูลลงในฐานข้อมูล) จะทำให้แน่ใจว่าข้อมูลทำงานตามที่คาดไว้


2

คุณสามารถส่งผ่านอาร์กิวเมนต์ของคุณโดยใช้ฟังก์ชัน encodeURIComponent ดังนั้นคุณจึงไม่ต้องกังวลเกี่ยวกับการส่งผ่านอักขระพิเศษใด ๆ

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

หรือ

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

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


1

คุณสามารถเข้ารหัสสตริงของคุณโดยใช้การเข้ารหัส Base64 ในฝั่ง JavaScript จากนั้นถอดรหัสทางฝั่งเซิร์ฟเวอร์ด้วย PHP (?)

JavaScript ( Docu )

var wysiwyg_clean = window.btoa( wysiwyg );

PHP ( Docu ):

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

1

วิธีที่แนะนำคือใช้ไลบรารี JavaScript เช่น jQuery และตั้งค่าตัวเลือกข้อมูลของคุณเป็นอ็อบเจ็กต์จากนั้นให้ jQuery ทำการเข้ารหัสดังนี้:

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

ถ้าคุณไม่สามารถใช้ jQuery (ซึ่งสวยมากมาตรฐานวันนี้) ใช้encodeURIComponent


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.