1

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]
3
  • This is what urldecode does (straight from the doc: Plus symbols ('+') are decoded to a space character. ). Please post some sample code. And no, $_POST will work the same way for a regular or ajax request. Commented Aug 1, 2010 at 23:39
  • no, it is not normal asking questions without bringing some example to make others understand what are you talking about Commented Aug 2, 2010 at 2:45
  • Please show your PHP code, since you have the + signs properly encoded as %2B in the Post Data. Commented Aug 2, 2010 at 3:57

3 Answers 3

3

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')
Sign up to request clarification or add additional context in comments.

Comments

2

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.

2 Comments

I added my request headers. Thanks :)
@David I'll see if I can reproduce the problem.
1

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 :)

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.