PHP不解码POST

时间:2010-08-01 23:37:01

标签: php

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]

3 个答案:

答案 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));

这对我有用:)