AJAX POST e segno più (+) - Come codificare?
-
21-09-2019 - |
Domanda
sto postando il contenuto di un campo di modulo tramite AJAX per uno script PHP e l'utilizzo di JavaScript per escape(field_contents)
. Il problema è che tutti i segni più vengono rimossi e sostituiti da spazi. Come posso tranquillamente 'codifica' il segno più e quindi in modo appropriato 'decodificare' sul lato PHP?
Soluzione
Usa encodeURIComponent()
in JS e in PHP si dovrebbe ricevere i valori corretti.
Nota: Quando si accede $_GET
, $_POST
o $_REQUEST
in PHP, si stanno recuperando i valori che sono stati già decodificati.
Esempio:
Nel vostro 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
Sul server:
echo $_GET['string']; // "+"
E 'solo la richiesta HTTP grezzo che contiene i dati URL codificato.
Per una richiesta GET è possibile recuperare questo dal URI. $_SERVER['REQUEST_URI']
o $_SERVER['QUERY_STRING']
. Per un POST urlencoded, file_get_contents('php://stdin')
NB:
decode()
funziona solo per i caratteri a singolo byte codificati. Non funzionerà per l'intera gamma UTF-8.
es:
text = "\u0100"; // Ā
// incorrect
escape(text); // %u0100
// correct
encodeURIComponent(text); // "%C4%80"
Nota: "%C4%80"
è equivalente a: escape('\xc4\x80')
Qual è la sequenza di byte (\xc4\x80
) che rappresenta Ā
in UTF-8. Quindi, se si utilizza encodeURIComponent()
tuo lato server deve sapere che sta ricevendo UTF-8. Altrimenti PHP manipolare la codifica.
Altri suggerimenti
In prova JavaScript:
encodeURIComponent()
e in PHP:
urldecode($_POST['field']);
Il valore esadecimale che stai cercando è %2B
Per ottenere automaticamente in PHP eseguire la stringa attraverso urlencode($stringVal)
. E quindi eseguirlo rhough urldecode($stringVal)
per tornare indietro.
Se si desidera che il JavaScript gestirlo, utilizzare escape( str )
Modifica
Dopo commento di @ bobince ho fatto di più la lettura e lui è corretta.
Utilizzare encodeURIComponent(str)
e decodeURIComponent(str)
. Fuga non converte i caratteri, solo per loro fuggire con \
di
Per renderlo più interessante e per consentire, auspicabilmente meno capelli tirando per qualcun altro. Utilizzando pitone, dizionario incorporato per un dispositivo che possiamo usare curl per configurare.
Problema: {"timezone":"+5"} //throws an error " 5"
Soluzione: {"timezone":"%2B"+"5"} //Works
Quindi, in poche parole:
var = {"timezone":"%2B"+"5"}
json = JSONEncoder().encode(var)
subprocess.call(["curl",ipaddress,"-XPUT","-d","data="+json])
Grazie a questo post!
Se si deve fare un ricciolo in php, è necessario utilizzare urlencode()
da PHP ma singolarmente!
strPOST = "Item1=" . $Value1 . "&Item2=" . urlencode("+")
Se lo fai urlencode(strPOST)
, vi porterà un altro problema, si avrà uno Item1 e & sarà modifica del valore xx% e di essere come un valore, vedere qui il ritorno!
Esempio 1
$strPOST = "Item1=" . $Value1 . "&Item2=" . urlencode("+") will give Item1=Value1&Item2=%2B
Esempio 2
$strPOST = urlencode("Item1=" . $Value1 . "&Item2=+") will give Item1%3DValue1%26Item2%3D%2B
Esempio 1 è il buon modo per preparare stringa POST in arricciatura
Esempio 2 dimostrano che il recettore non vedrà la parità e la commerciale per distinguere il valore!
il mio problema era con gli accenti (A e n) e il segno più (+) quando per cercare di salvare javascript "esempi di codice" a mysql:
la mia soluzione (non il modo migliore, ma funziona):
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;
}
per salvare:
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
funzione 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'");
}
?>