AJAX POST y signo más (+) - cómo codificar?
-
21-09-2019 - |
Pregunta
Quiero poner el contenido de un campo de formulario a través de Ajax a un script PHP y utilizando JavaScript para escape(field_contents)
. El problema es que los signos más están siendo despojados y reemplazados por espacios. ¿Cómo puedo con seguridad 'codificar' el signo más y luego apropiadamente 'decodificación' en el lado PHP?
Solución
Uso encodeURIComponent()
en JS y en PHP que debe recibir los valores correctos.
Nota: Al acceder a $_GET
, $_POST
o $_REQUEST
en PHP, que son valores que ya han sido decodificados recuperando.
Ejemplo:
En sus 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
En el servidor:
echo $_GET['string']; // "+"
Es sólo la petición HTTP prima que contiene los datos de URL codificada.
Para una petición GET se puede recuperar esto desde el URI. $_SERVER['REQUEST_URI']
o $_SERVER['QUERY_STRING']
. Para un puesto urlencoded, file_get_contents('php://stdin')
Nota:
decode()
sólo funciona para los caracteres de un solo byte codificado. No va a trabajar para la gama completa UTF-8.
por ejemplo:
text = "\u0100"; // Ā
// incorrect
escape(text); // %u0100
// correct
encodeURIComponent(text); // "%C4%80"
Nota: "%C4%80"
es equivalente a: escape('\xc4\x80')
que es la secuencia de bytes (\xc4\x80
) que representa Ā
en UTF-8. Así que si usa encodeURIComponent()
su lado servidor debe saber que está recibiendo UTF-8. De lo contrario PHP mangle la codificación.
Otros consejos
En JavaScript intento:
encodeURIComponent()
y en PHP:
urldecode($_POST['field']);
El valor hexadecimal que busca es %2B
Para conseguirlo automáticamente en PHP ejecutar su cadena a través de urlencode($stringVal)
. Y luego ejecutarlo rhough urldecode($stringVal)
para recuperarlo.
Si desea que el JavaScript para manejarlo, utiliza escape( str )
Editar
Después del comentario de @ bobince hice más lectura y él es correcta.
Utilice encodeURIComponent(str)
y decodeURIComponent(str)
. Escapar no convertirá los caracteres, sólo escapar de ellos con \
de
Para hacerlo más interesante y para permitir que espero menos de arrancarse el cabello de otra persona. El uso de pitón, diccionario incorporado para un dispositivo que se puede utilizar para configurar rizo.
Problema: {"timezone":"+5"} //throws an error " 5"
Solución: {"timezone":"%2B"+"5"} //Works
Así, en pocas palabras:
var = {"timezone":"%2B"+"5"}
json = JSONEncoder().encode(var)
subprocess.call(["curl",ipaddress,"-XPUT","-d","data="+json])
Gracias a este post!
Si usted tiene que hacer un rizo en php, se debe utilizar urlencode()
desde PHP pero individualmente!
strPOST = "Item1=" . $Value1 . "&Item2=" . urlencode("+")
Si lo hace urlencode(strPOST)
, que va a traer otro problema, tendrá una Elemento1 y Y serás% valor xx cambiar y ser como un solo valor, consulte aquí el retorno!
Ejemplo 1
$strPOST = "Item1=" . $Value1 . "&Item2=" . urlencode("+") will give Item1=Value1&Item2=%2B
Ejemplo 2
$strPOST = urlencode("Item1=" . $Value1 . "&Item2=+") will give Item1%3DValue1%26Item2%3D%2B
Ejemplo 1 es la buena manera de preparar la secuencia para POST en rizo
Ejemplo 2 muestran que el receptor no verá la igualdad y la ampersand para distinguir tanto valor!
mi problema era con los acentos (A e s) y el signo más (+) cuando i para tratar de salvar javascript "ejemplos de código" a MySQL:
mi solución (no la mejor manera, pero funciona):
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;
}
Función para guardar:
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
función 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'");
}
?>