Question

Je souhaite publier le contenu d'un champ de formulaire via AJAX à un script PHP et en utilisant 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 en toute sécurité « encode » le signe plus et de façon appropriée « décoder » sur le côté PHP?

Était-ce utile?

La solution

Utilisez encodeURIComponent() en JS et en 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és.

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']; // "+"

Il est seulement la requête HTTP brute qui contient les données codées URL.

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

NB:

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

par exemple:

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

Note: "%C4%80" est équivalent à: escape('\xc4\x80')

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

Autres conseils

Essai JavaScript:

encodeURIComponent() 

et en PHP:

urldecode($_POST['field']);

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

Pour obtenir automatiquement en PHP exécuter votre chaîne par urlencode($stringVal). Et puis exécutez rhough urldecode($stringVal) pour le récupérer.

Si vous voulez que le JavaScript pour gérer, utilisez escape( str )

Modifier

Après le commentaire de @ bobince Je l'ai fait plus de lecture et il est correct. Utilisez encodeURIComponent(str) et decodeURIComponent(str). Escape ne convertira pas les personnages, ne leur échapper avec de \

Pour le rendre plus intéressant et de permettre, espérons moins tirer les cheveux pour quelqu'un d'autre. En utilisant python, dictionnaire intégré pour un dispositif que l'on peut utiliser curl pour configurer.

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

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

Alors, en un mot:

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

Merci à ce poste!

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

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

Si vous urlencode(strPOST), vous vous apporter un autre problème, vous aurez un Item1 et & sera le changement% valeur xx et être 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 la bonne façon de préparer chaîne pour POST en boucle

Exemple 2 montrent que le récepteur ne verra pas l'égal et l'esperluette pour distinguer les deux valeur!

mon problème était avec les accents (á fr) et le signe plus (+) quand je pour tenter de sauver javascript "exemples de code" à mysql:

ma solution (pas la meilleure façon, mais cela fonctionne):

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 sauvegarder:

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

en fonction 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'");
}
?>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top