AJAX POST ve Artı İşareti (+) - Nasıl Kodlanır?


100

Bir form alanının içeriğini AJAX aracılığıyla bir PHP betiğine POST yapıyorum ve JavaScript kullanıyorum escape(field_contents). Sorun, artı işaretlerinin çıkarılıp boşluklarla değiştirilmesidir. Artı işaretini güvenli bir şekilde 'kodlayabilirim' ve ardından PHP tarafında uygun şekilde 'kodunu çözebilirim'?


açıklığa kavuşturmak için kodlamak yerine escape (field_contents) kullanıyordum
jalperin

Yanıtlar:


158

encodeURIComponent()JS'de ve PHP'de kullanım , doğru değerleri almalısınız.

Eğer eriştiğinizde: Not $_GET, $_POSTveya $_REQUESTPHP, zaten çözülmüş olması değerleri alınıyor.

Misal:

JS'nizde:

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

Sunucunuzda:

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

Yalnızca url kodlu verileri içeren ham HTTP isteğidir.

Bir GET talebi için bunu URI. $_SERVER['REQUEST_URI']veya $_SERVER['QUERY_STRING']. Urlencoded POST için,file_get_contents('php://stdin')

NB:

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

Örneğin:

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

Not: "%C4%80"eşdeğerdir:escape('\xc4\x80')

UTF-8'de \xc4\x80temsil eden bayt dizisi ( ) Ā. Dolayısıyla encodeURIComponent(), sunucu tarafınızı kullanırsanız , UTF-8 aldığını bilmeniz gerekir. Aksi takdirde PHP, kodlamayı karıştıracaktır.


Bir takip :URIComponent (metin) 'i kodladığımda ve metin akıllı alıntı (& rsqo;) gibi karakterler içerdiğinde, php betiği gereksiz karakterler görüyor gibi görünüyor. Bunun bir karakter kümesi sorunu olduğunu varsayıyorum, ancak nasıl çözeceğimi bilmiyorum. AJAX POST'u "Content-Type" ile yapıyorum: "application / x-www-form-urlencoded; charset = UTF-8" ve sunucu tarafında PHP5 kullanıyorum.
jalperin

Bu karakterleri nasıl görüyorsunuz? Tarayıcının UTF-8 olduğunu bildiğinden emin olmalısınız. HTML'de bunu ayarlayabilir <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">veya <meta charset="UTF-8">PHP'de Content-Type HTTP Başlığı ile de ayarlayabilirsiniz. header('Content-Type: text/html;charset=UTF-8');Not: & rsqo; tarayıcıda kodu çözmez (FF3.5).
bucabay

5
Artı (+) karakterinin uzaya dönüşmesiyle ilgili bir sorun yaşadım. UTF8'de diğer her şey yolunda gitti. EncodeURIComponent (JSON.stringify (rootObject)) ile kullanımda iyi şanslar elde ettim. Teşekkür ederim!
zneo

Bu problemle (bir javascript form postası aracılığıyla toplanan) parolalarla karşılaştığımda, parola = encodeURIComponent (password) ile çözdüm. PHP'ye iletildiğinde, şifrenin kodlanmış POST değeri doğru şekilde çalışır.
lowcrawler

20

JavaScript'te şunu deneyin:

encodeURIComponent() 

ve PHP'de:

urldecode($_POST['field']);

7
encodeURIComponent doğru cevaptır - ancak HTML kodlu veriler değil de URL kodlu veriler ürettiğinden, html_entity_encode çok uzaktır.
Quentin

1
urldecodePHP onu doldurmadan önce otomatik olarak çözeceği için de çok uzaktır $_POST.
Quentin

5

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

PHP'de otomatik olarak almak için dizenizi çalıştırın urlencode($stringVal). Ve sonra urldecode($stringVal)onu geri almak için iyice çalıştırın .

JavaScript'in bunu işlemesini istiyorsanız, şunu kullanın: escape( str )

Düzenle

@ Bobince'nin yorumundan sonra daha çok okudum ve o haklı. Kullanım encodeURIComponent(str)ve decodeURIComponent(str). Escape karakterleri dönüştürmez, yalnızca karakterleri \'s


1
Do not kullanmak escape(veya unescapeJavaScript); URL kodlamayla aynı değildirler ve + ve ASCII Unicode olmayan karakterler için yanlış gideceklerdir. encodeURIComponent / decodeURIComponent, neredeyse her zaman istediğiniz şeydir.
bobince

4

Daha ilginç hale getirmek ve umarım bir başkası için daha az saç çekmesini sağlamak. Python kullanarak, yapılandırmak için curl kullanabileceğimiz bir cihaz için oluşturulmuş sözlük.

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

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

Yani kısaca:

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

Bu gönderi için teşekkürler!


0

Eğer php'de curl yapmak zorunda kalırsanız urlencode(), PHP'den ama ayrı ayrı kullanmalısınız!

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

Bunu yaparsanız urlencode(strPOST), size başka bir problem getireceksiniz, bir Öğe1'e sahip olacaksınız ve% xx değerini değiştirecek ve tek bir değer olacak, buraya bakı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, rotasyonel olarak POST için dize hazırlamanın iyi bir yoludur

Örnek 2, reseptörün her iki değeri de ayırt etmek için eşit ve ve işareti görmeyeceğini gösterir!


-1

benim sorunum javascript "kod örneklerini" mysql'e kaydetmeye çalışırken aksanlar (á É ñ) ve artı işareti (+) ile ilgiliydi:

benim çözümüm (daha iyi bir yol değil, ama işe yarıyor):

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

kaydedilecek işlev:

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

php'de işlev:

<?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'");
}
?>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.