碰到一个非常诡异的问题:
XP Pro+SP3系统。
昨天程序原本都没问题,重启过一次apache之后,发现PHP无法取得POST url encoded 数据了,但是GET和POST multipart/form-data都可以正常获取。
也就是说当<form method="post">的时候,var_dump($_POST)为 array(0){};
当<form method="post" enctype="multipart/form-data">的时候,$_POST里面才会有值。
确定浏览器发送了POST数据了,无论是谷歌火狐IE6,传统表单提交还是ajax。
也不是只部分页面出现这个问题,所有的php都不行,甚至连phpMyAdmin都无法登录了。今天尝试了重新安装php5.2.17,重新安装apache2.2.22.0,都无法解决。
没办法,只好使用 IIS5.1 + PHP5.2.17 isapi再测试,结果这回倒可以了,但我总不好改用IIS吧……回忆昨天重启apache后出现问题之前,好像是运行过一次php下的go-pear.bat,然后在第一个界面就直接点叉关闭了;也有可能修改了一些其他的php.ini配置;
但最后我都重新解压了原版的php,重装了apache,按说应该不太可能是他们的原因?还是操作系统出什么诡异的状况了?哪位大侠碰到过这种问题么?我真不想重装系统……

解决方案 »

  1.   

    先看看 enctype='application/x-www-form-urlencoded' 结果如何?
      

  2.   

    你可以用$_QUERST接收一下值,看是否能接收到post过来的值,至于$_POST不能接受值,应该是配置问题,可能是你php.ini中的某个参数改变导致的!试着修改一下这个参数register_global 
      

  3.   

    不指定enctype时,默认就是"Content-Type:application/x-www-form-urlencoded"。
      

  4.   

    开始都是用的$_REQUEST,就是发现取不到之后,才测得$_POST,甚至是var_dump($GLOBALS),都找不到这些传过去的值。
    register_global 无论改为On/Off都不能解决(改后都重启过apache并用phpinfo()输出状态确保修改成功了)。
      

  5.   

    不错,默认值就是这个,但如果你的浏览器被修改了默认值的话,比如 text/plain
    那么就不能正常提交了
    所以要
    先看看 enctype='application/x-www-form-urlencoded' 结果如何?
      

  6.   

    用Chrome22和Firefox15+Firebug1.10.4分析过网络数据了,确保都是“Content-Type: application/x-www-form-urlencoded”。
      

  7.   

    问题解决!解决过程:
    因为电脑是双XP系统,我重启至另一个系统中,用同样位置的apache+php测试,故障依旧。因此确定不是系统的问题。
    再次怀疑是参数配置问题。
    于是重新解压一次php,直接使用未修改内容的“php.ini-recommended”做配置文件,测试发现问题竟然解决了。
    拿两个ini一一对比,将我原来的ini各处改动逐一替换并测试后,终于发现,问题出在这里:
    将其改为下面这样问题便消失了:
    我之前为了测试POST文件上传,改动了这里。
    因为上传文件只会用到 multipart/form-data,所以问题开始没有表现出来,但是后来再用普通的 POST 时,问题就出现了。当前最新的PHP手册中有如下含义的表示:
    手册原文参见 http://www.php.net/manual/zh/ini.core.php#ini.post-max-size可是我刚刚用 Windows XP Pro with SP3 + httpd-2.2.22-win32-x86-no_ssl (Apache) + php-5.2.17-Win32-VC6-X86 测试,却有如下发现:满心以为自己发现一个 PHP 的大 bug,可再仔细一看,手册原文那里还有一段话:
    也就是说,在32位系统中,如果使用简写法,其表示值超过 2^32 / 2 - 1 = 2147483647 时,计算结果会出错,因为 PHP 只是简单的将其按照 32 位有符号整数进行了一下位运算……
    也许这可以解释上面的部分现象,但不管怎样,上传超过2G的文件会导致限制失效,这个bug稍微严重了点,虽然一般没人会传那么大的文件。
      

  8.   

    另外我一开始重新安装php仍不能解决的原因,是因为把旧的php.ini直接拷过去用了,所以问题也继承过去了。
    而用IIS测试时,因为使用了默认的 php.ini-recommended 所以没出问题。