我在尝试提交大量字段时遇到了一个小问题。所以我写了一个脚本来测试php.ini中max_input_vars
选项的行为。
这让我很困惑。
我的代码:
<!doctype html>
<html>
<body>
<?php
$t = array();
if(isset($_POST['t'])) { $t = $_POST['t']; }
echo "POST-VARS COUNT: ". count($_POST)." <br />";
echo "POST-VARS[t] COUNT: ". count($t)." <br />";
echo "ini_get('max_input_vars'): ". ini_get("max_input_vars"). "<br />";
echo "ISSET($_POST['submit']): ". (isset($_POST['submit']) ? "TRUE" : "FALSE"). "<br />";
echo "<br />";
echo "<form method='post' action='{$_SERVER['PHP_SELF']}'>n";
for($j = 0; $j < 2000; $j++) {
for($i = 0; $i < 10; $i++) {
echo "<input type='hidden' name='t[$j][$i]' value='$i' />n";
}
}
echo "<input type='submit' name='submit' value='test'>n";
echo "</form>n";
?>
</body>
</html>
我用PHP 5.2和PHP 5.4测试了它,有奇怪的差异。在使用PHP 5.2时,虽然PHP .ini配置只允许提交5000个字段,但似乎所有20000个字段都被提交了。
POST-VARS COUNT: 2
POST-VARS[t] COUNT: 2000
ini_get('max_input_vars'): 5000
ISSET($_POST['submit']): TRUE
PHP版本5.4.30的输出:
POST-VARS COUNT: 1
POST-VARS[t] COUNT: 500
ini_get('max_input_vars'): 5000
ISSET($_POST['submit']): FALSE
问题是:
有人知道为什么php是这样的吗?这是PHP 5.2的bug吗?
max_input_vars
指令自PHP 5.3.9起可用,可以在文档(http://php.net/manual/en/info.configuration.php#ini.max-input-vars)中看到。然后它不应该在PHP 5.2中工作,即使你把它放入配置并尝试ini_get()
(我猜ini_get也会为任何不存在的指令工作?)。