造成此问题的原因有很多。最好检查您的错误日志。许多导致此症状的原因会将消息放入错误日志,但不会在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,但是PHP在构建$ _POST,$ _ GET,$ _ REQUEST和$ _COOKIE时仍会删除这些字符。如果您无法修复表单字段的值,则可以尝试以下操作:
/**
* 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;
}
?>