AJAX POST e segno più (+) - Come codificare?


98

Sto POSTANDO il contenuto di un campo modulo tramite AJAX a uno script PHP e utilizzo JavaScript per escape(field_contents). Il problema è che tutti i segni più vengono eliminati e sostituiti da spazi. Come posso "codificare" in sicurezza il segno più e quindi "decodificarlo" in modo appropriato sul lato PHP?


per chiarire, stavo usando escape (field_contents), non codificare
jalperin

Risposte:


156

Usalo encodeURIComponent()in JS e in PHP dovresti ricevere i valori corretti.

Nota: quando accedi $_GET, $_POSTo $_REQUESTin PHP, stai recuperando valori che sono già stati decodificati.

Esempio:

Nel tuo 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 tuo server:

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

È solo la richiesta HTTP non elaborata che contiene i dati codificati nell'URL.

Per una richiesta GET puoi recuperarlo da URI. $_SERVER['REQUEST_URI']o $_SERVER['QUERY_STRING']. Per un POST con codifica URL,file_get_contents('php://stdin')

NB:

decode()funziona solo per caratteri codificati a byte singolo. Non funzionerà per l'intera gamma UTF-8.

per esempio:

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

Nota: "%C4%80"è equivalente a:escape('\xc4\x80')

Che è la sequenza di byte ( \xc4\x80) che rappresenta Āin UTF-8. Quindi se usi il encodeURIComponent()tuo lato server devi sapere che sta ricevendo UTF-8. Altrimenti PHP altererà la codifica.


Un seguito: quando codificoURIComponent (testo) e il testo include caratteri come le virgolette intelligenti (& rsqo;), lo script php sembra vedere caratteri spazzatura. Presumo sia un problema di caratteri, ma non so come risolverlo. Sto eseguendo AJAX POST con "Content-Type": "application / x-www-form-urlencoded; charset = UTF-8" e sto usando PHP5 sul lato server.
jalperin

Come vedi questi personaggi? Devi assicurarti che il browser sappia che è UTF-8. In HTML puoi impostarlo <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">o <meta charset="UTF-8">puoi anche impostarlo in PHP con l'intestazione HTTP Content-Type. header('Content-Type: text/html;charset=UTF-8');PS: & rsqo; non decodifica nel browser (FF3.5).
Bucabay,

5
Ho avuto un problema con il carattere più (+) che cambiava nello spazio. Tutto il resto è andato bene in UTF8. Ho avuto fortuna con encodeURIComponent (JSON.stringify (rootObject)). Grazie!
zneo

Quando mi sono imbattuto in questo problema con le password (che sono state raccolte tramite un modulo javascript post), l'ho risolto con password = encodeURIComponent (password). Quando viene passato a PHP, il valore POST codificato della password funziona correttamente.
lowcrawler

19

In JavaScript prova:

encodeURIComponent() 

e in PHP:

urldecode($_POST['field']);

7
encodeURIComponent è la risposta giusta, ma poiché genera dati con codifica URL e non dati codificati HTML, html_entity_encode è lontano.
Quentin

1
urldecodeè anche lontano in quanto PHP lo decodificherà automaticamente prima di essere popolato $_POST.
Quentin

5

Il valore esadecimale che stai cercando è %2B

Per ottenerlo automaticamente in PHP, esegui la tua stringa urlencode($stringVal). E poi eseguilo urldecode($stringVal)di nuovo per riaverlo .

Se vuoi che JavaScript lo gestisca, usa escape( str )

modificare

Dopo il commento di @ bobince ho letto di più e ha ragione. Usa encodeURIComponent(str)e decodeURIComponent(str). Escape non convertirà i personaggi, ma solo eseguirà l'escape con \'s


1
Non utilizzare escape(o unescape) in JavaScript; non sono la stessa cosa della codifica URL e andranno male per + e per qualsiasi carattere Unicode non ASCII. encodeURIComponent / decodeURIComponent è quasi sempre quello che vuoi.
bobince

4

Per renderlo più interessante e, si spera, consentire a qualcun altro di tirare meno i capelli. Usando python, dizionario costruito 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!


0

Se devi fare un curl in php, dovresti usarlo urlencode()da PHP ma individualmente!

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

Se lo fai urlencode(strPOST), ti porterai un altro problema, avrai un Item1 e & cambierà il valore% xx e sarà come un valore, vedi qui sotto 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

L'esempio 1 è il modo migliore per preparare la stringa per il POST in curl

L'esempio 2 mostra che il recettore non vedrà l'uguale e la e commerciale per distinguere entrambi i valori!


-1

il mio problema era con gli accenti (á É ñ) e il segno più (+) quando cercavo di salvare "esempi di codice" javascript su mysql:

la mia soluzione (non nel 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;
}

funzione 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 in 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'");
}
?>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.