2009-09-03 21 views
76

Bir form alanının içeriğini bir PHP betiğine AJAX aracılığıyla POST'liyorum ve JavaScript'i escape(field_contents)'a kullanın. Sorun, herhangi bir artı işaretinin sıyrılıp yer değiştirmesidir. Artı işaretini güvenli bir şekilde 'nasıl' kodlayabilirim ve sonra PHP tarafında uygun şekilde 'çözebilirim'?AJAX POST ve Artı İşaret (+) - Nasıl Kodlanır?

+0

açıklığa kavuşturmak için, – jalperin

cevap

113

Onları JSde ve PHP'de encodeURIComponent() kullanın doğru değerleri almalısınız.

Not: PHP'de $_GET, veya $_REQUEST'a eriştiğinizde, daha önce kodu çözülen değerleri alıyorsunuz demektir.

Örnek: JS

: En sunucuda

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

:

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

Bu url kodlanmış verileri içeren yalnızca ham HTTP isteği olduğunu.

Bir GET isteği için bunu URI. $_SERVER['REQUEST_URI'] veya $_SERVER['QUERY_STRING']'dan alabilirsiniz. kodlanmış bir POST için file_get_contents('php://stdin')

Not:

decode() sadece tek bayt kodlanmış karakterler için çalışır. Tam UTF-8 aralığı için çalışmayacaktır.

örn

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

Not: UTF-8 temsil ettiği bayt dizisi (\xc4\x80) olan escape('\xc4\x80')

: "%C4%80" eşdeğerdir. Yani encodeURIComponent() yöntemini kullanırsanız, sunucu tarafınızın UTF-8 olduğunu bilmesi gerekir. Aksi halde PHP kodlamayı karıştırır.

+0

Tek takip: TARİF yazısını (metin) kodladığımda ve metin akıllı alıntı (&rsqo;) gibi karakterleri içeriyorsa, php betiği gereksiz karakterleri görüyor gibi görünüyor. Sanırım bir kukla problemi, ama nasıl çözeceğimi bilmiyorum. "Content-Type" ile AJAX POST'unu yapıyorum: "application/x-www-form-urlencoded; charset = UTF-8" ve sunucu tarafında PHP5 kullanıyorum. – jalperin

+0

Bu karakterleri nasıl görüntülüyorsunuz? Tarayıcının UTF-8 olduğunu bildiğinden emin olmalısın. HTML'de '' veya '' i de ayarlayabilirsiniz. PHP'de İçerik Türü HTTP Üstbilgisi ile.header ('Content-Type: text/html; charset = UTF-8'); 'PS: &rsqo; tarayıcıda kod çözmez (FF3.5). – bucabay

+1

Seni seviyorum çocuklar! bana her zaman yardım edersin! :) – Alejandra

15

JavaScript'inizde deneyin:

encodeURIComponent() 

ve PHP:

urldecode($_POST['field']); 
+7

kodlama değil kodlama (field_contents) kullanıyordum, doğru cevap - ama kodlanmış HTML kodlu veri üretmediği için html_entity_encode yolu kapalı. – Quentin

5

Aradığınız onaltılık değer %2B

otomatik PHP'de almak urlencode($stringVal) aracılığıyla dize çalıştırmak için ise . Ve sonra geri almak için urldecode($stringVal) rhough çalıştırın.

JavaScript idare istiyorsanız

, @ bobince ben daha fazla okuma yaptım 'in yorumları sonrasında escape(str)

düzenle

kullanmak ve o doğrudur. encodeURIComponent(str) ve decodeURIComponent(str)'u kullanın. Kaçış karakterleri dönüştürmeyecek, sadece \

+1

* JavaScript'te '' escape' (veya 'unescape') kullanmayın; URL kodlamasıyla aynı değildir ve + ve ASCII olmayan Unicode karakterleri için yanlıştır. encodeURIComponent/decodeURIComponent neredeyse istediğiniz her şeydir. – bobince

1

Eğer php'de bir curl yapmak zorundaysanız, PHP'den urlencode()'u kullanmalısınız; Eğer urlencode(strPOST) yaparsanız

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

, size başka bir sorun getirecektir, değişikliğin% xx değerini olmak ve bir değer olarak olacak bir Öğe1'ı ve & olacak, aşağıya dönüşünü görün!

Örnek 1

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

Örnek 2

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

Örnek 1 reseptörü eşit görmeyeceğinizi kıvırmak

Örnek 2 içinde POST dize hazırlamak için iyi bir yoldur ve ampersand her iki değeri de ayırt eder!

0

benim sorunum vurgular (á a n) ve ben mysql javascript "kod örnekleri" kurtarmaya çalışmak artı işareti (+) ile oldu:

benim çözüm (değil iyi bir yol, ancak) çalışır:

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

fonksiyon kaydetmek için:

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 

fu php alanındaki olumsuz:

<?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'"); 
} 
?> 
3

daha ilginç hale getirmek için ve umarım bir başkası için çekerek daha az saç etkinleştirmek için. Python'u kullanarak, yapılandırmak için curl kullanabileceğimiz bir aygıt için sözlük oluşturduk.

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

Çözüm: {"timezone":"%2B"+"5"} //Works

Yani, özetle: Bu yayına

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

teşekkür!