Question AJAX POST et Plus Sign (+) - Comment encoder?


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" en toute sécurité le signe plus, puis le décoder de manière appropriée du côté PHP?


80
2017-09-03 13:26


origine


Réponses:


Utilisation encodeURIComponent() dans JS et PHP, vous devriez recevoir les valeurs correctes.

Remarque: lorsque vous accédez $_GET, $_POST ou $_REQUEST En 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']; // "+"

Ce n'est que la requête HTTP brute qui contient les données encodées en URL.

Pour une demande GET, vous pouvez récupérer ceci depuis le URI. $_SERVER['REQUEST_URI'] ou $_SERVER['QUERY_STRING']. Pour un POST encodé en url, file_get_contents('php://stdin')

NB:

decode() ne fonctionne que pour les caractères codés sur un seul 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" est équivalent à: escape('\xc4\x80')

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


120
2017-09-03 16:20



En JavaScript essayez:

encodeURIComponent() 

et en PHP:

urldecode($_POST['field']);

17
2017-09-03 13:30



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

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

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

modifier

Après le commentaire de @ bobince, j'ai fait plus de lecture et il a raison. Utilisation encodeURIComponent(str) et decodeURIComponent(str). Escape ne convertira pas les caractères, seulement les échapper avec \'s


5
2017-09-03 13:31



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

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

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

Donc, en quelques mots:

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

Merci à ce post!


3
2018-03-06 22:18



Si vous devez faire une boucle en php, vous devez utiliser urlencode() de PHP mais individuellement!

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

Si tu fais urlencode(strPOST), vous allez vous poser un autre problème, vous aurez un article1 et & changera la valeur% xx et sera en une seule 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 le test POST en boucle

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


0
2018-04-23 05:52



Mon problème était avec les accents (á É ñ) et le signe plus (+) lorsque je tentais de sauvegarder les "exemples de code" javascript dans mysql:

ma solution (pas la meilleure, 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 à 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'");
}
?>

-1
2018-01-22 20:41