AJAX POST et signe plus (+) - Comment encoder?

98

Je POSTE le contenu d'un champ de formulaire via AJAX dans un script PHP et j'utilise JavaScript pour escape(field_contents). Le problème est que tous les signes plus sont supprimés et remplacés par des espaces. Comment puis-je «encoder» le signe plus en toute sécurité, puis le «décoder» de manière appropriée côté PHP?

jalperin
la source
pour clarifier, j'utilisais escape (field_contents), pas encoder
jalperin

Réponses:

156

Utilisez encodeURIComponent()en JS et en PHP, vous devriez recevoir les valeurs correctes.

Remarque: lorsque vous accédez $_GET, $_POSTou $_REQUESTen PHP, vous récupérez des valeurs qui ont déjà été décodées.

Exemple:

Dans votre JS:

// url encode your string
var string = encodeURIComponent('+'); // "%2B"
// send it to your server
window.location = 'http://example.com/?string='+string; // http://example.com/?string=%2B

Sur votre serveur:

echo $_GET['string']; // "+"

Seule la requête HTTP brute contient les données encodées en URL.

Pour une requête GET, vous pouvez la récupérer à partir du fichier URI. $_SERVER['REQUEST_URI']ou $_SERVER['QUERY_STRING']. Pour un POST codé par URL,file_get_contents('php://stdin')

NB:

decode()ne fonctionne que pour les caractères codés sur un octet. Cela ne fonctionnera pas pour toute la gamme UTF-8.

par exemple:

text = "\u0100"; // Ā
// incorrect
escape(text); // %u0100 
// correct
encodeURIComponent(text); // "%C4%80"

Remarque: "%C4%80"équivaut à:escape('\xc4\x80')

Quelle est la séquence d'octets ( \xc4\x80) qui représente Āen UTF-8. Donc, si vous utilisez encodeURIComponent()votre côté serveur, vous devez savoir qu'il reçoit UTF-8. Sinon, PHP modifiera l'encodage.

Bucabay
la source
Un suivi: lorsque j'encodeURIComponent (texte) et que le texte inclut des caractères comme la citation intelligente (& rsqo;), le script php semble voir des caractères indésirables. Je suppose que c'est un problème de jeu de caractères, mais je ne sais pas comment le résoudre. Je fais le AJAX POST avec "Content-Type": "application / x-www-form-urlencoded; charset = UTF-8", et j'utilise PHP5 côté serveur.
jalperin le
Comment voyez-vous ces personnages? Vous devez vous assurer que le navigateur sait qu'il s'agit de UTF-8. En HTML, vous pouvez le définir <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">ou <meta charset="UTF-8">vous pouvez également le définir en PHP avec l'en-tête HTTP Content-Type. header('Content-Type: text/html;charset=UTF-8');PS: & rsqo; ne décode pas dans le navigateur (FF3.5).
bucabay
5
J'ai eu un problème avec le caractère plus (+) changeant dans l'espace. Tout le reste s'est bien passé en UTF8. J'ai eu de la chance avec encodeURIComponent (JSON.stringify (rootObject)). Je vous remercie!
zneo
En rencontrant ce problème avec les mots de passe (qui ont été collectés via un post de formulaire javascript), je l'ai résolu avec password = encodeURIComponent (mot de passe). Lorsqu'elle est transmise à PHP, la valeur POST codée du mot de passe fonctionne correctement.
lowcrawler
19

En JavaScript, essayez:

encodeURIComponent() 

et en PHP:

urldecode($_POST['field']);
Deniss Kozlovs
la source
7
encodeURIComponent est la bonne réponse - mais comme il génère des données encodées en URL et non des données encodées en HTML, html_entity_encode est bien loin.
Quentin
1
urldecodeest également très éloigné car PHP le décodera automatiquement avant de le remplir $_POST.
Quentin
5

La valeur hexadécimale que vous recherchez est %2B

Pour l'obtenir automatiquement en PHP, exécutez votre chaîne urlencode($stringVal). Et puis exécutez-le urldecode($stringVal)pour le récupérer.

Si vous souhaitez que JavaScript le gère, utilisez escape( str )

Éditer

Après le commentaire de @ bobince, j'ai fait plus de lecture et il a raison. Utilisez encodeURIComponent(str)et decodeURIComponent(str). Escape ne convertira pas les personnages, ne les échappera qu'avec \'s

Rob Allen
la source
1
Ne pas utiliser escape(ou unescape) en JavaScript; ils ne sont pas les mêmes que le codage d'URL et iront mal pour + et tous les caractères Unicode non ASCII. encodeURIComponent / decodeURIComponent est presque toujours ce que vous voulez.
bobince
4

Pour le rendre plus intéressant et, espérons-le, permettre moins de tirer les cheveux pour quelqu'un d'autre. Utilisation de python, dictionnaire construit pour un appareil que nous pouvons utiliser curl pour configurer.

Problème: {"timezone":"+5"} //throws an error " 5"

Solution: {"timezone":"%2B"+"5"} //Works

Donc, en un mot:

var = {"timezone":"%2B"+"5"}
json = JSONEncoder().encode(var)
subprocess.call(["curl",ipaddress,"-XPUT","-d","data="+json])

Merci à ce post!

Pawr
la source
0

Si vous devez faire un curl en php, vous devriez utiliser urlencode()depuis PHP mais individuellement!

strPOST = "Item1=" . $Value1 . "&Item2=" . urlencode("+")

Si vous le faites urlencode(strPOST), vous vous poserez un autre problème, vous aurez un Item1 et & changera la valeur% xx et sera comme une valeur, voir ici le retour!

Exemple 1

$strPOST = "Item1=" . $Value1 . "&Item2=" . urlencode("+") will give Item1=Value1&Item2=%2B

Exemple 2

$strPOST = urlencode("Item1=" . $Value1 . "&Item2=+") will give Item1%3DValue1%26Item2%3D%2B

L'exemple 1 est le bon moyen de préparer une chaîne pour POST dans curl

L'exemple 2 montre que le récepteur ne verra pas l'égal et l'esperluette pour distinguer les deux valeurs!

Marc
la source
-1

mon problème était avec les accents (á É ñ) et le signe plus (+) lorsque j'essayais de sauvegarder des "exemples de code" javascript sur mysql:

ma solution (pas la meilleure façon, mais ça marche):

javascript:

function replaceAll( text, busca, reemplaza ){
  while (text.toString().indexOf(busca) != -1)
  text = text.toString().replace(busca,reemplaza);return text;
}


function cleanCode(cod){
code = replaceAll(cod , "|", "{1}" ); // error | palos de explode en java
code = replaceAll(code, "+", "{0}" ); // error con los signos mas   
return code;
}

fonction pour enregistrer:

function save(pid,code){
code = cleanCode(code); // fix sign + and |
code = escape(code); // fix accents
var url = 'editor.php';
var variables = 'op=save';
var myData = variables +'&code='+ code +'&pid='+ pid +'&newdate=' +(new Date()).getTime();    
var result = null;
$.ajax({
datatype : "html",
data: myData,  
url: url,
success : function(result) {
    alert(result); // result ok                     
},
}); 
} // end function

fonction en php:

<?php
function save($pid,$code){
    $code= preg_replace("[\{1\}]","|",$code);
    $code= preg_replace("[\{0\}]","+",$code);
    mysql_query("update table set code= '" . mysql_real_escape_string($code) . "' where pid='$pid'");
}
?>
BX16Soupapes
la source