フォームフィールドのコンテンツをAJAX経由でPHPスクリプトにPOSTし、JavaScriptを使用してescape(field_contents)
。問題は、プラス記号が削除されてスペースに置き換えられていることです。プラス記号を安全に「エンコード」してから、PHP側で適切に「デコード」するにはどうすればよいですか?
6 に答える
JSおよびPHPで使用するencodeURIComponent()
と、正しい値を受け取るはずです。
注:にアクセスするとき$_GET
、$_POST
または$_REQUEST
PHPで、すでにデコードされている値を取得しています。
例:
あなたのJSで:
// 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']; // "+"
urlエンコードされたデータを含むのは生のHTTPリクエストのみです。
URI. $_SERVER['REQUEST_URI']
GETリクエストの場合、またはからこれを取得できます$_SERVER['QUERY_STRING']
。urlencoded POSTの場合、file_get_contents('php://stdin')
注意:
decode()
シングルバイトでエンコードされた文字に対してのみ機能します。UTF-8の全範囲では機能しません。
例えば:
text = "\u0100"; // Ā
// incorrect
escape(text); // %u0100
// correct
encodeURIComponent(text); // "%C4%80"
注:次"%C4%80"
と同等です:escape('\xc4\x80')
これは、 UTF-8\xc4\x80
で表すバイトシーケンス( )です。Ā
したがってencodeURIComponent()
、サーバー側を使用する場合は、UTF-8を受信していることを認識している必要があります。それ以外の場合、PHPはエンコーディングをマングルします。
JavaScriptで試してみてください:
encodeURIComponent()
およびPHPの場合:
urldecode($_POST['field']);
探している16進値は%2B
PHPで自動的に取得するには、文字列を実行しますurlencode($stringVal)
。そして、それを元に戻すurldecode($stringVal)
ためにそれを実行します。
JavaScriptで処理する場合は、escape( str )
編集
@bobinceのコメントの後、私はもっと読んだのですが、彼は正しいです。とを使用encodeURIComponent(str)
しdecodeURIComponent(str)
ます。\
Escapeは文字を変換せず、 'sでのみエスケープします
それをより面白くし、うまくいけば他の誰かのために髪を引っ張ることを少なくすることを可能にするため。Pythonを使用して、curlを使用して構成できるデバイス用の辞書を作成しました。
問題:{"timezone":"+5"} //throws an error " 5"
解決:{"timezone":"%2B"+"5"} //Works
つまり、一言で言えば:
var = {"timezone":"%2B"+"5"}
json = JSONEncoder().encode(var)
subprocess.call(["curl",ipaddress,"-XPUT","-d","data="+json])
この投稿に感謝します!
phpでカールを実行する必要がある場合はurlencode()
、PHPから使用する必要がありますが、個別に使用する必要があります。
strPOST = "Item1=" . $Value1 . "&Item2=" . urlencode("+")
そうした場合urlencode(strPOST)
、別の問題が発生します。Item1が1つあり、&は%xx値を変更し、1つの値になります。ここでリターンを参照してください。
例1
$strPOST = "Item1=" . $Value1 . "&Item2=" . urlencode("+") will give Item1=Value1&Item2=%2B
例2
$strPOST = urlencode("Item1=" . $Value1 . "&Item2=+") will give Item1%3DValue1%26Item2%3D%2B
例1は、curlでPOST用の文字列を準備するための良い方法です。
例2は、受容体が両方の値を区別するために等しいアンパサンドを認識しないことを示しています。
私の問題は、JavaScriptの「コード例」をmysqlに保存しようとしたときのアクセント(áÉñ)とプラス記号(+)にありました。
私の解決策(より良い方法ではありませんが、それは機能します):
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;
}
保存する関数:
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の関数:
<?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'");
}
?>