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.