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.