Comment puis-je envoyer le caractère «&» (esperluette) via AJAX?


90

Je veux envoyer quelques variables et une chaîne avec la POSTméthode de JavaScript.

J'obtiens la chaîne de la base de données, puis je l'envoie à une page PHP. J'utilise un XMLHttpRequestobjet.

Le problème est que la chaîne contient le caractère &plusieurs fois et que le $_POSTtableau en PHP le voit comme plusieurs clés.

J'ai essayé de remplacer le &par \&par la replace()fonction, mais cela ne semble rien faire.

Quelqu'un peut-il aider?

Le code javascript et la chaîne ressemblent à ceci:

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

La chaîne est:

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

Réponses:


170

Vous pouvez utiliser encodeURIComponent () .

Il échappera à tous les caractères qui ne peuvent pas apparaître textuellement dans les URL:

var wysiwyg_clean = encodeURIComponent(wysiwyg);

Dans cet exemple, le caractère esperluette &sera remplacé par la séquence d'échappement %26, qui est valide dans les URL.


Est-ce suffisant pour échapper en toute sécurité aux données ou est-ce "juste" suffisant pour éviter le problème de l'esperluette?
Wottensprels

@Sprottenwels, il suffit d'encoder correctement toutes les données. Qu'entendez-vous par «en toute sécurité» dans ce contexte?
Frédéric Hamidi


9

Vous devez échapper à l'url de l'esperluette. Utilisation:

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

Comme le souligne Wolfram, cela est bien géré (avec tous les autres caractères spéciaux) par encodeURIComponent.


4

La réponse de Ramil Amr ne fonctionne que pour le caractère &. Si vous avez d'autres caractères spéciaux, vous devez utiliser PHP htmlspecialchars() et JS encodeURIComponent().

Tu peux écrire:

var wysiwyg_clean = encodeURIComponent(wysiwyg);

Et côté serveur:

htmlspecialchars($_POST['wysiwyg']);

Cela garantira que AJAX transmettra les données comme prévu, et que PHP (au cas où vous insérez les données dans une base de données) s'assurera que les données fonctionnent comme prévu.



1

Vous pouvez encoder votre chaîne en utilisant l'encodage Base64 côté JavaScript, puis la décoder côté serveur avec PHP (?).

JavaScript ( Docu )

var wysiwyg_clean = window.btoa( wysiwyg );

PHP ( Docu ):

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

1

Le moyen préféré est d'utiliser une bibliothèque JavaScript telle que jQuery et de définir votre option de données en tant qu'objet, puis de laisser jQuery faire l'encodage, comme ceci:

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

Si vous ne pouvez pas utiliser jQuery (qui est à peu près la norme de nos jours), utilisez encodeURIComponent .


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.