PHP not decoding POST
Is it normal for PHP not to decode $_POST sent as application/x-www-form-urlencoded through AJAX?
I want to use urldecode but it gets rid of my + characters. Help?
:
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]
Part of urldecode's functionality is to turn +
signs into spaces. To get around this, you should urlencode any +
signs in your string, so they turn into %2B
So:
<?php
$theTag = 'c++';
urldecode($theTag);
// output is "c "
$theTag = urlencode($theTag);
urldecode($theTag);
// output is "c++"
?>
Now, the superglobals $_GET and $_REQUEST are already decoded. Using urldecode() on an element in $_GET or $_REQUEST could have unexpected and dangerous results. I'm not sure about $_POST
. But it well may be decoded too.
From your question, I'm not sure exactly what you're dealing with, but looking over the comments on urldecode in the PHP manual, 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')
PHP does indeed decode your data. The problem is it's doubly encoded.
Take the second variable:
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>
As you can see, you have to call urldecode
twice. So there's something wrong on the Javascript side that's making it be doubly encoded.
Is it normal for PHP not to decode $_POST sent as application/x-www-form-urlencoded through AJAX?
No, it certainly isn't. POST here the HTTP request headers, if it doesn't work, so we can try to see if there's something wrong with the request.
I want to use urldecode but it gets rid of my + characters. Help?
You can use rawurldecode
instead. However, I don't understand why you'd need this.
Here is my solution, I was having the same problem.
JavaScript code to send data:
var content = '<br>%20``+++dqwcdwdw';
content = urlencode(content);
content = encodeURIComponent(content);
then the data is sent by POST and
("Content-type", "application/x-www-form-urlencoded; charset=UTF-8");
Here is the php code to receive data:
$content = urldecode($_POST['thepostfieldname']);
$content = stripslashes(nl2br($content));
This works for me :)
精彩评论