我有一个非常大的html表单(包含行的表格,其中包含多个输入),我需要通过POST请求提交到PHP脚本。问题是一些值没有通过,并且在PHP的$_POST超级全局中缺失。
我检查(使用Firebug扩展)这些值实际上是由浏览器发送到服务器的。
$_POST会被填充,但有些值就是丢失了。
我使用以下命令检查了原始请求:
$raw_post = file_get_contents('php://input');并且返回的字符串具有这些值。它们只是没有被解析成$_POST数组。我注意到的奇怪的事情是,似乎php://输入值在经过一定长度后被剪切,而字符串的其余部分没有到达$_POST。
我考虑了post_max_size和memory_limit,并将它们设置为较大的值:
memory_limit = 256M
post_max_size = 150M但是根据php文档,如果请求大于post_max_size,$_POST不应该包含任何值。
由于表格和请求太大,我不能在这里发布它,但我可以发布我用来调试问题的php脚本:
var_dump($file = file_get_contents('php://input'));
var_dump($_POST);
//... then i parsed the $file服务器版本: Apache/2.2.9 (Debian)
PHP版本: PHP 5.3.2-0.dotdeb.2
大家能解释一下PHP出现这种奇怪行为的原因吗?我应该怎么做(更改php设置、代码?)在处理表单时使用$_POST数组?
EDIT:需要明确的是:不仅缺少值。$_POST也不包含这些密钥。
e.x。原始帖子片段:
t_dodparam%5B198%5D=&t_dodparam2%5B198%5D=&t_kolejnosc%5B198%5D=199&n_indeks=201&n_wartosc=testtesttest键't_dodparam‘在post中,它有键198。其余参数丢失(e.x。t_dodparam2正在开机自检,但没有198这样的键,$_POST里也没有n_wartosc这样的键)
发布于 2011-02-22 21:00:17
修改包含字符空格、点、左方括号和其他字符的字段,以与过时的register_globals兼容
您可以在此处的注释中找到许多解决方法:PHP: Variables From External Sources
对于Exampe (由POSTer评论):
<?php
//Function to fix up PHP's messing up POST input containing dots, etc.
function getRealPOST() {
$pairs = explode("&", file_get_contents("php://input"));
$vars = array();
foreach ($pairs as $pair) {
$nv = explode("=", $pair);
$name = urldecode($nv[0]);
$value = urldecode($nv[1]);
$vars[$name] = $value;
}
return $vars;
}
?>发布于 2012-03-12 12:31:03
我只是通过在我的PHP配置文件中向max_input_vars添加一个值来修复这个问题。根据this的说法。它是在5.3.9中引入的,但是在一些包升级之后,我在5.3.2中遇到了这个问题。
max_input_vars的默认值是1000,对于我的表单来说太小了。
发布于 2011-12-10 05:01:14
有许多不同的因素可能会导致这种情况。最好检查一下你的错误日志。导致此症状的许多情况都会将消息放入错误日志,但不会在PHP应用程序中显示错误。
一些可能的原因:
Suhosin
Suhosin是PHP的一个扩展,旨在保护服务器和用户免受PHP应用程序和PHP核心中已知和未知缺陷的影响。它做的一件事就是限制$_POST、$_GET、$_REQUEST和$_COOKIE的大小。如果你的问题是Suhosin,你会在日志中看到一个错误,比如
超过警报配置的POST变量限制-删除变量'foo‘
解决方案很简单,只需增加php.ini中允许的最大变量数即可。如果你没有suhosin部分,那就创建一个。如下所示:
[suhosin]
suhosin.request.max_vars = 1000 # Default is 200
suhosin.post.max_vars = 1000 # Default is 200还有其他suhosin设置可能会导致这种情况,但这些是最有可能的候选设置。
表单域名称无效
在过去,PHP有一个名为register_globals的设置(现在已废弃),它可以自动将GET和POST变量转换为PHP变量。因此,如果您的表单包含字段'foo‘和'bar',则在提交表单时,将自动创建变量$foo和$bar。但是,PHP变量名中有几个字符是无效的(空格、点、左方括号等)。根据您使用的字符,变量可能会删除无效字符、缺少其值或未设置。尽管register_globals已不再使用,但在构建$_POST、$_GET、$_REQUEST和$_COOKIE时仍会删除这些字符。如果您无法修复表单域的值,则可以尝试执行以下操作:
<?php
/**
* Converts raw POST data into an array.
*
* Does not work for hierarchical POST data.
*
* @return array
*/
function real_post() {
static $post;
if (!isset($post)) {
$pairs = explode("&", file_get_contents("php://input"));
$post = array();
foreach ($pairs as $pair) {
$x = explode("=", $pair);
$post[rawurldecode($x[0])] = rawurldecode($x[1]);
}
}
return $post;
}
?>https://stackoverflow.com/questions/5077969
复制相似问题