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>

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.


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


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.


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.



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

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 .


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.