我正在通过AJAX将表单字段的内容发布到PHP脚本并使用JavaScript escape(field_contents)
。问题是任何加号都被剥离并被空格所取代。如何安全地“编码”加号,然后在PHP端对其进行适当的“解码”?
答案 0 :(得分:132)
在JS和PHP中使用encodeURIComponent()
,您应该收到正确的值。
注意:当您在PHP中访问$_GET
,$_POST
或$_REQUEST
时,您正在检索已经解码的值。
示例:
在你的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']; // "+"
只有原始HTTP请求包含url编码数据。
对于GET请求,您可以从URI. $_SERVER['REQUEST_URI']
或$_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将破坏编码。
答案 1 :(得分:16)
在JavaScript中尝试:
encodeURIComponent()
并在PHP中:
urldecode($_POST['field']);
答案 2 :(得分:4)
您要查找的十六进制值为%2B
要在PHP中自动获取它,请通过urlencode($stringVal)
运行字符串。然后运行它urldecode($stringVal)
以获取它。
如果您希望JavaScript处理它,请使用 escape( str )
修改强>
在@ bobince的评论之后我做了更多的阅读,他是对的。
使用encodeURIComponent(str)
和decodeURIComponent(str)
。 Escape不会转换字符,只能使用\
的
答案 3 :(得分:4)
使它更有趣,并希望减少对其他人的头发拉动。 使用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])
感谢这篇文章!
答案 4 :(得分:0)
如果你必须在php中做一个卷曲,你应该使用PHP中的urlencode()
但是单独使用!
strPOST = "Item1=" . $Value1 . "&Item2=" . urlencode("+")
如果你做urlencode(strPOST)
,你会遇到另一个问题,你将有一个Item1和&将更改%xx值并作为一个值,请在此处查看返回!
示例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表明受体不会看到相等的和&符号来区分这两个值!
答案 5 :(得分:-1)
我的问题是重音符号(áÉñ)和加号(+)当我尝试将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'");
}
?>