我有一个非常大的html表单(包含行的表,其中包含多个输入),我需要通过POST请求提交给PHP脚本.问题是PHP的$ _POST超全局中没有一些值没有出现.
我检查(使用Firebug扩展),这些值实际上是由浏览器发送到服务器的.
$ _POST被填充,但有些值只是缺失.
我检查了什么是原始请求使用:
$raw_post = file_get_contents('php://input');
Run Code Online (Sandbox Code Playgroud)
并且返回的字符串具有值.它们只是没有解析成$ _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
Run Code Online (Sandbox Code Playgroud)
服务器版本:Apache/2.2.9(Debian)
PHP版本:PHP 5.3.2-0.dotdeb.2
可以enyone解释这种奇怪的PHP行为的原因,我应该怎么做(更改PHP设置,代码?)在处理表单时使用$ _POST数组?
编辑:要明确:不仅缺少价值观.$ _POST也不包含这些键.
原始帖子的片段:
t_dodparam%5B198%5D=&t_dodparam2%5B198%5D=&t_kolejnosc%5B198%5D=199&n_indeks=201&n_wartosc=testtesttest
Run Code Online (Sandbox Code Playgroud)
密钥't_dodparam'在post中,它有密钥198.缺少其余的参数(ex t_dodparam2在post中,但它没有198这样的密钥,并且$ _POST中没有n_wartosc这样的密钥)
fel*_*igl 29
PHP修改包含字符空格,点,开方括号等的字段以与不推荐使用的register_globals兼容
你可以在这里的评论中找到很多解决方法: PHP:来自外部资源的变量
例如(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;
}
?>
Run Code Online (Sandbox Code Playgroud)
Dal*_*lin 11
有许多不同的东西可能导致这种情况.最好检查您的错误日志.导致此症状的许多事情都会将消息放入错误日志中,但不会在PHP应用程序中显示错误.
一些可能的原因:
Suhosin是PHP的扩展,旨在保护服务器和用户免受PHP应用程序和PHP核心中的已知和未知缺陷的影响.它所做的一件事是限制$ _POST,$ _GET,$ _REQUEST和$ _COOKIE的大小.如果您的问题是Suhosin,您的日志中会出现错误,例如
ALERT - 超出配置的POST变量限制 - 删除变量'foo'
解决方案很简单,只需增加php.ini中允许的最大变量数.如果你没有suhosin部分,只需创建一个.像这样:
[suhosin]
suhosin.request.max_vars = 1000 # Default is 200
suhosin.post.max_vars = 1000 # Default is 200
Run Code Online (Sandbox Code Playgroud)
还有其他的suhosin设置会导致这种情况,但这些设置最有可能.
回到过去,PHP有一个名为register_globals(现在已被删除)的设置,它自动将GET和POST变量转换为PHP变量.因此,如果您的表单包含字段'foo'和'bar',则在提交该表单时,将自动创建变量$ foo和$ bar.但是,有几个字符在PHP变量名称(空格,点,空方括号等)中无效.根据您使用的字符,变量可能会删除无效字符,丢失其值或取消设置.尽管不再使用register_globals,但在构建$ _POST,$ _GET,$ _REQUEST和$ _COOKIE时,PHP仍然会删除这些字符.如果您无法修复表单字段的值,可以尝试以下方法:
<?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;
}
?>
Run Code Online (Sandbox Code Playgroud)
小智 6
使用"parse_str"将查询字符串转换为php结构怎么样?这个函数与http_build_query相反.
$b = array();
parse_str(file_get_contents("php://input"), $b);
Run Code Online (Sandbox Code Playgroud)