AJAX POST dan Tanda Plus (+) - Bagaimana cara Encode?

98

Saya mem-POST isi bidang formulir melalui AJAX ke skrip PHP dan menggunakan JavaScript ke escape(field_contents). Masalahnya adalah bahwa tanda tambah apa pun dihilangkan dan diganti dengan spasi. Bagaimana saya bisa 'menyandikan' tanda plus dengan aman dan kemudian 'mendekodekan' dengan tepat di sisi PHP?

jalperin
sumber
untuk memperjelas, saya menggunakan escape (field_contents), bukan menyandikan
jalperin

Jawaban:

156

Gunakan encodeURIComponent()di JS dan PHP Anda harus menerima nilai yang benar.

Catatan: Saat Anda mengakses $_GET, $_POSTatau $_REQUESTdalam PHP, Anda mengambil nilai yang telah diterjemahkan.

Contoh:

Di JS Anda:

// 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

Di server Anda:

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

Hanya permintaan HTTP mentah yang berisi data yang dikodekan url.

Untuk permintaan GET, Anda dapat mengambilnya dari URI. $_SERVER['REQUEST_URI']atau $_SERVER['QUERY_STRING']. Untuk POST berkode url,file_get_contents('php://stdin')

NB:

decode()hanya berfungsi untuk karakter yang dikodekan byte tunggal. Ini tidak akan berfungsi untuk rentang UTF-8 penuh.

misalnya:

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

Catatan: "%C4%80"setara dengan:escape('\xc4\x80')

Yang merupakan urutan byte ( \xc4\x80) yang diwakili Ādalam UTF-8. Jadi jika Anda menggunakan encodeURIComponent()sisi server Anda harus tahu bahwa itu menerima UTF-8. Jika tidak, PHP akan merusak pengkodean.

bucabay
sumber
Satu tindak lanjut: Ketika saya menyandikanURIComponent (teks) dan teks menyertakan karakter seperti kutipan pintar (& rsqo;), skrip php tampaknya melihat karakter sampah. Saya berasumsi ini masalah charset, tapi saya tidak tahu bagaimana menyelesaikannya. Saya melakukan POST AJAX dengan "Jenis Konten": "application / x-www-form-urlencoded; charset = UTF-8", dan saya menggunakan PHP5 di sisi server.
jalperin
Bagaimana Anda melihat karakter ini? Anda harus memastikan browser mengetahui bahwa itu UTF-8. Dalam HTML Anda dapat mengatur <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">atau <meta charset="UTF-8">Anda juga dapat mengaturnya dalam PHP dengan HTTP Header Content-Type. header('Content-Type: text/html;charset=UTF-8');NB: & rsqo; tidak memecahkan kode di browser (FF3.5).
bucabay
5
Saya punya masalah dengan karakter plus (+) yang berubah menjadi spasi. Segala sesuatu yang lain berjalan dengan baik di UTF8. Saya beruntung menggunakan dengan encodeURIComponent (JSON.stringify (rootObject)). Terima kasih!
zneo
Ketika mengalami masalah ini dengan kata sandi (yang dikumpulkan melalui posting formulir javascript) saya menyelesaikannya dengan kata sandi = encodeURIComponent (kata sandi). Ketika diteruskan ke PHP, nilai kata sandi POST yang dikodekan berfungsi dengan benar.
lowcrawler
19

Dalam JavaScript coba:

encodeURIComponent() 

dan dalam PHP:

urldecode($_POST['field']);
Deniss Kozlovs
sumber
7
encodeURIComponent adalah jawaban yang benar - tetapi karena menghasilkan data yang dikodekan URL dan bukan data yang dikodekan HTML, html_entity_encode jauh.
Quentin
1
urldecodejuga jauh karena PHP akan mendekodekannya secara otomatis sebelum diisi $_POST.
Quentin
5

Nilai heksadesimal yang Anda cari adalah %2B

Untuk mendapatkannya secara otomatis dalam PHP, jalankan string Anda urlencode($stringVal). Dan kemudian jalankan dengan kasar urldecode($stringVal)untuk mendapatkannya kembali.

Jika Anda ingin JavaScript menanganinya, gunakan escape( str )

Edit

Setelah komentar @ bobince, saya membaca lebih banyak dan dia benar. Gunakan encodeURIComponent(str)dan decodeURIComponent(str). Escape tidak akan mengubah karakter, hanya melarikan diri dengan \'s

Rob Allen
sumber
1
Jangan gunakan escape(atau unescape) di JavaScript; mereka tidak sama dengan pengkodean URL dan akan salah untuk + dan karakter Unicode non-ASCII. encodeURIComponent / decodeURIComponent hampir selalu seperti yang Anda inginkan.
bobince
4

Untuk membuatnya lebih menarik dan semoga memungkinkan lebih sedikit menarik rambut untuk orang lain. Menggunakan python, kamus yang dibuat untuk perangkat yang dapat kita gunakan untuk konfigurasi curl.

Masalah: {"timezone":"+5"} //throws an error " 5"

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

Jadi, singkatnya:

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

Terima kasih untuk posting ini!

Pawr
sumber
0

Jika Anda harus melakukan curl di php, Anda harus menggunakan urlencode()dari PHP tetapi secara individual!

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

Jika kamu melakukan urlencode(strPOST) , Anda akan membawa Anda masalah lain, Anda akan memiliki satu Item1 dan & akan berubah nilai% xx dan menjadi sebagai satu nilai, lihat di sini kembali!

Contoh 1

$strPOST = "Item1=" . $Value1 . "&Item2=" . urlencode("+") will give Item1=Value1&Item2=%2B

Contoh 2

$strPOST = urlencode("Item1=" . $Value1 . "&Item2=+") will give Item1%3DValue1%26Item2%3D%2B

Contoh 1 adalah cara yang baik untuk menyiapkan string untuk POST di curl

Contoh 2 menunjukkan bahwa reseptor tidak akan melihat sama dan ampersand untuk membedakan keduanya nilai!

Marc
sumber
-1

masalah saya adalah dengan aksen (á É ñ) dan tanda tambah (+) ketika saya mencoba menyimpan "contoh kode" javascript ke mysql:

solusi saya (bukan cara yang lebih baik, tetapi berhasil):

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;
}

fungsi untuk menyimpan:

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

fungsi di 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'");
}
?>
BX16Soupapes
sumber