未知原因PHP突然无法获取POST url encoded数据

CaiKanXP 2012-10-12 11:25:13
碰到一个非常诡异的问题:
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,按说应该不太可能是他们的原因?还是操作系统出什么诡异的状况了?

哪位大侠碰到过这种问题么?我真不想重装系统……
...全文
587 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
CaiKanXP 2012-10-12
  • 打赏
  • 举报
回复
用Chrome22和Firefox15+Firebug1.10.4分析过网络数据了,确保都是“Content-Type: application/x-www-form-urlencoded”。
[Quote=引用 5 楼 的回复:]
不错,默认值就是这个,但如果你的浏览器被修改了默认值的话,比如 text/plain
那么就不能正常提交了
所以要
先看看 enctype='application/x-www-form-urlencoded' 结果如何?
……
[/Quote]
xuzuning 2012-10-12
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
不指定enctype时,默认就是"Content-Type:application/x-www-form-urlencoded"。
[/Quote]
不错,默认值就是这个,但如果你的浏览器被修改了默认值的话,比如 text/plain
那么就不能正常提交了
所以要
先看看 enctype='application/x-www-form-urlencoded' 结果如何?
CaiKanXP 2012-10-12
  • 打赏
  • 举报
回复
开始都是用的$_REQUEST,就是发现取不到之后,才测得$_POST,甚至是var_dump($GLOBALS),都找不到这些传过去的值。
register_global 无论改为On/Off都不能解决(改后都重启过apache并用phpinfo()输出状态确保修改成功了)。
[Quote=引用 2 楼 的回复:]

你可以用$_QUERST接收一下值,看是否能接收到post过来的值,至于$_POST不能接受值,应该是配置问题,可能是你php.ini中的某个参数改变导致的!试着修改一下这个参数register_global
[/Quote]
CaiKanXP 2012-10-12
  • 打赏
  • 举报
回复
不指定enctype时,默认就是"Content-Type:application/x-www-form-urlencoded"。
[Quote=引用 1 楼 的回复:]

先看看 enctype='application/x-www-form-urlencoded' 结果如何?
[/Quote]
xuyanlu 2012-10-12
  • 打赏
  • 举报
回复
你可以用$_QUERST接收一下值,看是否能接收到post过来的值,至于$_POST不能接受值,应该是配置问题,可能是你php.ini中的某个参数改变导致的!试着修改一下这个参数register_global
xuzuning 2012-10-12
  • 打赏
  • 举报
回复
先看看 enctype='application/x-www-form-urlencoded' 结果如何?

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

解决过程:
因为电脑是双XP系统,我重启至另一个系统中,用同样位置的apache+php测试,故障依旧。因此确定不是系统的问题。
再次怀疑是参数配置问题。
于是重新解压一次php,直接使用未修改内容的“php.ini-recommended”做配置文件,测试发现问题竟然解决了。
拿两个ini一一对比,将我原来的ini各处改动逐一替换并测试后,终于发现,问题出在这里:
[Quote=php.ini]post_max_size = 2G[/Quote]
将其改为下面这样问题便消失了:
[Quote=php.ini]post_max_size = 1G[/Quote]
我之前为了测试POST文件上传,改动了这里。
因为上传文件只会用到 multipart/form-data,所以问题开始没有表现出来,但是后来再用普通的 POST 时,问题就出现了。

当前最新的PHP手册中有如下含义的表示:
[Quote=根据 PHP 手册叙述归纳的理论]
配置项 post_max_size 和 upload_max_filesize 都可以接受“缩写的字节值”,即可以使用 K,M,G 表示千兆吉。
另外 post_max_size 应该大于 upload_max_filesize (意思是说不这么设置的话,可能会出现文件大小未超过 upload_max_filesize 却超过 post_max_size 也会导致上传失败)。
另外当 POST 数据超出 post_max_size 范围后,$_POST 和 $_FILES 将为空。
[/Quote]
手册原文参见 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 测试,却有如下发现:
[Quote=PHP bug 描述]
1. post_max_size 使用简写法,且值等于或超过 2G 时,application/x-www-form-urlencoded 形式的 POST 数据会被丢失而无法获取。(比如 2G 会出现此问题,但 2147483648 却不会有问题)
2. upload_max_filesize 使用简写法,且值等于或超过 2G 时,其限制会失效,超过2G的文件仍然可以上传成功。(比如 2048M 会出现此问题,但 2147483648 却不会有问题)
3. 当上传文件大小超过 2G 时,post_max_size 对 multipart/form-data 的限制会失效,可以通过 $_POST 获取到数据。
4. 当post_max_size 和 upload_max_filesize 都用完整的 integer 字节数表示,且值大到某个程度时(可能是大于2G吧),上传未超过配置大小的文件也可能失败。
[/Quote]

满心以为自己发现一个 PHP 的大 bug,可再仔细一看,手册原文那里还有一段话:
[Quote=Note:]
PHP allows shortcuts for bit values, including K (kilo), M (mega) and G (giga). PHP will do the conversions automatically if you use any of these. Be careful not to exceed the 32 bit signed integer limit (if you're using 32bit versions) as it will cause your script to fail.
[/Quote]
也就是说,在32位系统中,如果使用简写法,其表示值超过 2^32 / 2 - 1 = 2147483647 时,计算结果会出错,因为 PHP 只是简单的将其按照 32 位有符号整数进行了一下位运算……
也许这可以解释上面的部分现象,但不管怎样,上传超过2G的文件会导致限制失效,这个bug稍微严重了点,虽然一般没人会传那么大的文件。

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧