PHP不通过AJAX解码作为application / x-www-form-urlencoded发送的$ _POST是否正常?
我想使用urldecode,但它摆脱了我的+字符。帮助
15:51:55.490[755ms][total 755ms] Status: 200[OK]
POST Load Flags[LOAD_BYPASS_CACHE LOAD_BACKGROUND ] Content Size[72] Mime Type[text/html]
Request Headers:
Host[]
User-Agent[Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8]
Accept[text/html, */*]
Accept-Language[en-us,en;q=0.5]
Accept-Encoding[gzip,deflate]
Accept-Charset[ISO-8859-1,utf-8;q=0.7,*;q=0.7]
Keep-Alive[115]
Proxy-Connection[keep-alive]
Content-Type[application/x-www-form-urlencoded; charset=UTF-8]
X-Requested-With[XMLHttpRequest]
Content-Length[164]
Pragma[no-cache]
Cache-Control[no-cache]
Post Data:
id[133]
content[%253Cp%253E%250A%2509Test%2520test%2520-%2520this%2520will%2520disappear%253A%2520%2B%253C%2Fp%253E%250A]
title[Plus%2520character%2520not%2520working]
Response Headers:
Via[1.1 KIGALI]
Connection[Keep-Alive]
Proxy-Connection[Keep-Alive]
Content-Length[72]
Date[Mon, 02 Aug 2010 03:51:55 GMT]
Content-Type[text/html; charset=utf-8]
Server[Apache/2.2.12 (Ubuntu)]
X-Powered-By[PHP/5.2.10-2ubuntu6.4]
Vary[Accept-Encoding]
Keep-Alive[timeout=15, max=100]
答案 0 :(得分:3)
urldecode的部分功能是将+
符号转换为空格。要解决此问题,您应该对字符串中的任何+
符号进行urlencode ,所以他们变成%2B
所以:
<?php
$theTag = 'c++';
urldecode($theTag);
// output is "c "
$theTag = urlencode($theTag);
urldecode($theTag);
// output is "c++"
?>
现在,the superglobals $_GET and $_REQUEST are already decoded. Using urldecode() on an element in $_GET or $_REQUEST could have unexpected and dangerous results。我不确定$_POST
。但它也可能被解码。
从您的问题来看,我不确定您正在处理什么,但在PHP手册中查看urldecode上的评论,here is a comment you may be interested in:
It's worth pointing out that if you are using AJAX and need to encode strings that are being sent to a PHP application, you may not need to decode them in PHP.
<?php
echo stripslashes(nl2br($_POST['message']));
?>
Will properly output a message sent with the javascript code if the message is encoded:
message = encodeURIComponent(message)
And is sent with an AJAX POST request with the header:
ajaxVar.setRequestHeader('Content-type', 'application/x-www-form-urlencoded')
答案 1 :(得分:2)
PHP确实解码了您的数据。问题在于它是双重编码的。
取第二个变量:
glopes@nebm:~$ php -r "echo urldecode(urldecode('%253Cp%253E%250A%2509Test%25 20test%2520-%2520this%2520will%2520disappear%253A%2520%2B%253C%2Fp%253E%250A') );" <p> Test test - this will disappear: </p>
如您所见,您必须拨打urldecode
两次。所以在Javascript方面存在一些错误,使得它被编码为双重编码。
PHP不通过AJAX解码作为application / x-www-form-urlencoded发送的$ _POST是否正常?
不,当然不是。在这里发布HTTP请求标头,如果它不起作用,那么我们可以尝试查看请求是否有问题。
我想使用urldecode,但它摆脱了我的+字符。帮助
您可以改用rawurldecode
。但是,我不明白为什么你需要这个。
答案 2 :(得分:1)
这是我的解决方案,我遇到了同样的问题。
发送数据的JavaScript代码:
var content = '<br>%20``+++dqwcdwdw';
content = urlencode(content);
content = encodeURIComponent(content);
然后通过POST发送数据
("Content-type", "application/x-www-form-urlencoded; charset=UTF-8");
这是接收数据的php代码:
$content = urldecode($_POST['thepostfieldname']);
$content = stripslashes(nl2br($content));
这对我有用:)