Jak wysłać znak „&” (ampersand) przez AJAX?

90

Chcę wysłać kilka zmiennych i ciąg z POSTmetodą z JavaScript.

Pobieram ciąg z bazy danych, a następnie wysyłam go na stronę PHP. Używam XMLHttpRequestobiektu.

Problem polega na tym, że ciąg zawiera znak &kilka razy, a $_POSTtablica w PHP widzi go jak wiele kluczy.

Próbowałem zastępując &ze \&z replace()funkcji, ale nie wydaje się do niczego.

Czy ktoś może pomóc?

Kod javascript i ciąg wygląda następująco:

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

Ciąg to:

 <span class="style2">&quot;Busola&quot;</span>
candino
źródło

Odpowiedzi:

170

Możesz użyć encodeURIComponent () .

Spowoduje to usunięcie wszystkich znaków, które nie mogą występować dosłownie w adresach URL:

var wysiwyg_clean = encodeURIComponent(wysiwyg);

W tym przykładzie znak ampersand &zostanie zastąpiony sekwencją ucieczki %26, która obowiązuje w adresach URL.

Frédéric Hamidi
źródło
Czy to wystarczy, aby bezpiecznie uciec przed danymi, czy też wystarczy „tylko”, aby uniknąć problemu z ampersandem?
Wottensprels
@Sprottenwels, wystarczy poprawnie zakodować wszystkie dane. Co w tym kontekście oznacza „bezpiecznie”?
Frédéric Hamidi
15

Możesz chcieć użyć encodeURIComponent () .

encodeURIComponent("&quot;Busola&quot;"); // => %26quot%3BBusola%26quot%3B
Wolfram
źródło
9

Musisz zmienić adres URL na znak ampersand. Posługiwać się:

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

Jak wskazuje Wolfram, jest to ładnie obsługiwane (wraz ze wszystkimi innymi znakami specjalnymi) przez encodeURIComponent.

Ned Batchelder
źródło
4

Odpowiedź Ramila Amra działa tylko dla znaku &. Jeśli masz inne znaki specjalne, powinieneś użyć PHP htmlspecialchars() i JS encodeURIComponent().

Możesz pisać:

var wysiwyg_clean = encodeURIComponent(wysiwyg);

A po stronie serwera:

htmlspecialchars($_POST['wysiwyg']);

Zapewni to, że AJAX przekaże dane zgodnie z oczekiwaniami, a PHP (na wypadek, gdybyś wstawiał dane do bazy danych) upewni się, że dane działają zgodnie z oczekiwaniami.

Nadav S.
źródło
1

Możesz zakodować swój ciąg przy użyciu kodowania Base64 po stronie JavaScript, a następnie zdekodować go po stronie serwera za pomocą PHP (?).

JavaScript ( Docu )

var wysiwyg_clean = window.btoa( wysiwyg );

PHP ( Docu ):

var wysiwyg = base64_decode( $_POST['wysiwyg'] );
Sirko
źródło
1

Preferowanym sposobem jest użycie biblioteki JavaScript, takiej jak jQuery i ustawienie opcji danych jako obiektu, a następnie pozwól jQuery wykonać kodowanie, na przykład:

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

Jeśli nie możesz użyć jQuery (co jest obecnie standardem), użyj encodeURIComponent .

Christopher Tokar
źródło
0
encodeURIComponent(Your text here);

Spowoduje to obcięcie znaków specjalnych.

user10164982
źródło
Nie dodaje to żadnej wartości do powyższych odpowiedzi
Ivan Kaloyanov