首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一些输入值丢失,但在PHP :// $_POST中存在

一些输入值丢失,但在PHP :// $_POST中存在
EN

Stack Overflow用户
提问于 2011-02-22 20:14:53
回答 14查看 76.6K关注 0票数 54

我有一个非常大的html表单(包含行的表格,其中包含多个输入),我需要通过POST请求提交到PHP脚本。问题是一些值没有通过,并且在PHP的$_POST超级全局中缺失。

我检查(使用Firebug扩展)这些值实际上是由浏览器发送到服务器的。

$_POST会被填充,但有些值就是丢失了。

我使用以下命令检查了原始请求:

代码语言:javascript
复制
$raw_post = file_get_contents('php://input');

并且返回的字符串具有这些值。它们只是没有被解析成$_POST数组。我注意到的奇怪的事情是,似乎php://输入值在经过一定长度后被剪切,而字符串的其余部分没有到达$_POST。

我考虑了post_max_size和memory_limit,并将它们设置为较大的值:

代码语言:javascript
复制
memory_limit = 256M
post_max_size = 150M

但是根据php文档,如果请求大于post_max_size,$_POST不应该包含任何值。

由于表格和请求太大,我不能在这里发布它,但我可以发布我用来调试问题的php脚本:

代码语言:javascript
复制
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。原始帖子片段:

代码语言:javascript
复制
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这样的键)

EN

回答 14

Stack Overflow用户

回答已采纳

发布于 2011-02-22 21:00:17

修改包含字符空格、点、左方括号和其他字符的字段,以与过时的register_globals兼容

您可以在此处的注释中找到许多解决方法:PHP: Variables From External Sources

对于Exampe (由POSTer评论):

代码语言:javascript
复制
<?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;
}
?>
票数 33
EN

Stack Overflow用户

发布于 2012-03-12 12:31:03

我只是通过在我的PHP配置文件中向max_input_vars添加一个值来修复这个问题。根据this的说法。它是在5.3.9中引入的,但是在一些包升级之后,我在5.3.2中遇到了这个问题。

max_input_vars的默认值是1000,对于我的表单来说太小了。

票数 31
EN

Stack Overflow用户

发布于 2011-12-10 05:01:14

有许多不同的因素可能会导致这种情况。最好检查一下你的错误日志。导致此症状的许多情况都会将消息放入错误日志,但不会在PHP应用程序中显示错误。

一些可能的原因:

Suhosin

Suhosin是PHP的一个扩展,旨在保护服务器和用户免受PHP应用程序和PHP核心中已知和未知缺陷的影响。它做的一件事就是限制$_POST、$_GET、$_REQUEST和$_COOKIE的大小。如果你的问题是Suhosin,你会在日志中看到一个错误,比如

超过警报配置的POST变量限制-删除变量'foo‘

解决方案很简单,只需增加php.ini中允许的最大变量数即可。如果你没有suhosin部分,那就创建一个。如下所示:

代码语言:javascript
复制
[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时仍会删除这些字符。如果您无法修复表单域的值,则可以尝试执行以下操作:

代码语言:javascript
复制
<?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;
}
?>
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5077969

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档