AJAX POST và Dấu cộng (+) - Làm thế nào để mã hóa?


98

Tôi đang ĐĂNG nội dung của một trường biểu mẫu qua AJAX vào một tập lệnh PHP và sử dụng JavaScript để escape(field_contents). Vấn đề là mọi dấu cộng đều bị loại bỏ và thay thế bằng dấu cách. Làm cách nào để tôi có thể 'mã hóa' dấu cộng một cách an toàn và sau đó 'giải mã' nó một cách thích hợp ở phía PHP?


để làm rõ, tôi đã sử dụng lối thoát (field_contents), không mã hóa
jalperin

Câu trả lời:


156

Sử dụng encodeURIComponent()trong JS và trong PHP, bạn sẽ nhận được các giá trị chính xác.

Lưu ý: Khi bạn truy cập $_GET, $_POSThoặc $_REQUESTtrong PHP, bạn đang lấy giá trị đã được giải mã.

Thí dụ:

Trong JS của bạn:

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

Trên máy chủ của bạn:

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

Nó chỉ là yêu cầu HTTP thô chứa dữ liệu được mã hóa url.

Đối với một yêu cầu GET, bạn có thể lấy nó từ URI. $_SERVER['REQUEST_URI']hoặc $_SERVER['QUERY_STRING']. Đối với một BÀI ĐĂNG được mã hóa nhanh,file_get_contents('php://stdin')

NB:

decode()chỉ hoạt động cho các ký tự được mã hóa byte đơn. Nó sẽ không hoạt động cho phạm vi UTF-8 đầy đủ.

ví dụ:

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

Lưu ý: "%C4%80"tương đương với:escape('\xc4\x80')

Đó là chuỗi byte ( \xc4\x80) đại diện Ātrong UTF-8. Vì vậy, nếu bạn sử dụng encodeURIComponent()phía máy chủ của bạn phải biết rằng nó đang nhận UTF-8. Nếu không PHP sẽ xử lý mã hóa.


Một phần tiếp theo: Khi tôi mã hóaURIComponent (văn bản) và văn bản bao gồm các ký tự như dấu ngoặc kép thông minh (& rsqo;), tập lệnh php dường như thấy các ký tự rác. Tôi cho rằng đó là vấn đề về bộ ký tự, nhưng tôi không biết cách giải quyết nó. Tôi đang thực hiện AJAX POST với "Content-Type": "application / x-www-form-urlencoded; charset = UTF-8" và tôi đang sử dụng PHP5 ở phía máy chủ.
jalperin

Bạn thấy những ký tự này như thế nào? Bạn phải đảm bảo rằng trình duyệt biết đó là UTF-8. Trong HTML, bạn có thể đặt <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">hoặc <meta charset="UTF-8">bạn cũng có thể đặt nó trong PHP với Tiêu đề HTTP Loại Nội dung. header('Content-Type: text/html;charset=UTF-8');Tái bút: & rsqo; không giải mã trong trình duyệt (FF3.5).
bucabay

5
Tôi gặp sự cố với ký tự dấu cộng (+) thay đổi thành dấu cách. Mọi thứ khác đều diễn ra tốt đẹp trong UTF8. Tôi đã gặp may mắn khi sử dụng với encodeURIComponent (JSON.stringify (rootObject)). Cảm ơn bạn!
zneo

Khi gặp sự cố này với mật khẩu (được thu thập thông qua một bài đăng trên biểu mẫu javascript), tôi đã giải quyết nó bằng password = encodeURIComponent (mật khẩu). Khi được chuyển cho PHP, giá trị POST được mã hóa của mật khẩu hoạt động chính xác.
lowcrawler

19

Trong JavaScript, hãy thử:

encodeURIComponent() 

và trong PHP:

urldecode($_POST['field']);

7
encodeURIComponent là câu trả lời phù hợp - nhưng vì nó tạo ra dữ liệu được mã hóa URL chứ không phải dữ liệu được mã hóa HTML, nên html_entity_encode không có lợi.
Quentin

1
urldecodecũng không phải là cách vì PHP sẽ tự động giải mã nó trước khi đưa vào $_POST.
Quentin

5

Giá trị thập lục phân bạn đang tìm kiếm là %2B

Để lấy nó tự động trong PHP, hãy chạy chuỗi của bạn qua urlencode($stringVal). Và sau đó chạy nó urldecode($stringVal)để lấy lại nó.

Nếu bạn muốn JavaScript xử lý nó, hãy sử dụng escape( str )

Biên tập

Sau bình luận của @ bobince, tôi đã đọc nhiều hơn và anh ấy đúng. Sử dụng encodeURIComponent(str)decodeURIComponent(str). Escape sẽ không chuyển đổi các ký tự, chỉ thoát chúng bằng \'s


1
Không sử dụng escape(hoặc unescape) trong JavaScript; chúng không giống như mã hóa URL và sẽ sai đối với + và bất kỳ ký tự Unicode nào không phải ASCII. encodeURIComponent / decodeURIComponent hầu như luôn là thứ bạn muốn.
bobince

4

Để làm cho nó thú vị hơn và hy vọng có thể cho người khác ít nhổ tóc hơn. Sử dụng python, từ điển được xây dựng cho một thiết bị mà chúng tôi có thể sử dụng curl để định cấu hình.

Vấn đề: {"timezone":"+5"} //throws an error " 5"

Giải pháp: {"timezone":"%2B"+"5"} //Works

Vì vậy, tóm lại:

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

Cảm ơn bài viết này!


0

Nếu bạn phải làm một phần mềm trong php, bạn nên sử dụng urlencode()từ PHP nhưng riêng lẻ!

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

Nếu bạn làm vậy urlencode(strPOST), bạn sẽ mang đến cho bạn một vấn đề khác, bạn sẽ có một Item1 và & sẽ thay đổi giá trị% xx và là một giá trị, hãy xem phần trả lại ở đây!

ví dụ 1

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

Ví dụ 2

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

Ví dụ 1 là cách tốt để chuẩn bị chuỗi cho POST trong curl

Ví dụ 2 cho thấy rằng thụ thể sẽ không nhìn thấy dấu bằng và dấu và để phân biệt cả hai giá trị!


-1

vấn đề của tôi là với dấu (á É ñ) và dấu cộng (+) khi tôi cố gắng lưu "ví dụ mã" javascript vào mysql:

giải pháp của tôi (không phải là cách tốt hơn, nhưng nó hoạt động):

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

chức năng để lưu:

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

hàm trong 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'");
}
?>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.