为什么在PHP中提交textarea时,_POST有时为空

5

在ubuntu上,Apache 2.2.4下运行PHP 4.4和PHP 5.2.3。

我正在运行Moodle 1.5.3,并最近在更新课程时遇到了问题。如果在表单的文本区域中输入了大量文本,则$_POST变量为空,但如果只输入了短文本,则正常工作。

我已将post_max_size从8M增加到200M,并将memory_limit增加到256M,但这并没有帮助。 我已经将LimitRequestFieldSize和LimitRequestLine加倍至16380,并将LimitRequestBody设置为0,但没有改善。

我已经在谷歌上搜索答案,但没有找到答案。

火狐浏览器的HTTP头显示内容大小为3816,包含正确数据,因此数据只是未传递到$_POST。

系统在几周前一直运行良好。唯一更改的是/etc/hosts以纠正exim4电子邮件服务器的HELO问题。

我可以在没有运行exim4的开发机器上复制此问题,因此我认为这只是巧合。

感谢您的协助。


奇怪。你确定了确切的阈值吗?对于那些希望重现这个问题的人来说,细节可能很有用。 - Bobby Jack
你说小量文本没有问题:你能找到大约的限制吗? - nickf
这可能显而易见,但您是否已经检查表单确实使用了POST,而不是GET? - troelskn
不,确切的阈值似乎有所变化,但2702个字符似乎会导致失败,有时更少。 - Puzzled
嗯...我认为你需要继续努力找出问题所在。它是可变的事实表明你没有遇到一些固定的限制,很可能你遇到了一个错误,可能与内存管理有关。有任何奇怪的字符吗?表格中有任何非标准的内容吗? - Bobby Jack
文本包含HTML标记。表单中有一些JavaScript和隐藏字段。 - Puzzled
5个回答

2
我不太清楚,无法提供有用的答案,以下是我做出的一个很有教养的猜测(至少我希望如此)。
首先,您应该通过access_log或例如firebug来调试整个请求。(无论如何都要安装Firebug。)对我来说,您的问题听起来像是在中间发生了重定向。我给你举个例子:
假设这是您的结构:
/form.php
/directory/index.php

这是您的表格:
<form action="/directory" method="post">
...
</form>

在这种情况下的问题是,尽管/directory是一个有效的URL,但Apache会再次重定向到/directory/,因此您将失去负载(也就是应该在$_POST中的内容)。

1
的enctype是什么?可能会限制通过表单发送的数据量。
您还可以使用以下代码检查传入的原始$_POST数据:
file_get_contents('php://input');

为确保实际有数据发送。 请参阅这些建议此处


1

这可能与帖子的大小无关,而是与新行之前的行长度有关。如果他们使用 Moodle WYSIWYG 视图,则 html 将被放入一行中而没有换行符。如果您进入 html 并在每 1000 个字符左右按回车键,它是否有效?


0

这似乎是一个Apache或Apache/PHP集成问题。如果$_POST为空,那么这可能暗示着HTTP服务器没有将POST信息传递给PHP。如果我是你,我会调查一下Apache的配置。


HTTP 实时标头(一款 Firefox 扩展程序)可以正确显示 POST 内容。 - Puzzled

0

这很明显,但是你执行了 /etc/init.d/apache2 restart吗?

此外,error_log 文件应该显示一些关于是否超过设置限制的帖子大小的信息。考虑增加详细度以排除故障。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接