E_WARNING
がPHPによって生成されることを知っています
しかし、スクリプトでこれを検出するにはどうすればよいでしょうか?
「十分に近い」方法は、チェックすることですif( count($_POST, COUNT_RECURSIVE) == ini_get("max_input_vars"))
これは、POST vars の数がたまたま制限に達した場合に誤検出を引き起こしますが、デフォルトの制限が 1000 であることを考慮すると、問題になることはまずありません。
count($_POST, COUNT_RECURSIVE)
配列ツリー内のすべてのノードをカウントするため、正確ではありませんが、input_vars はターミナル ノードのみです。たとえば、$_POST['a']['b'] = 'c'
input_var は 1 ですが、使用COUNT_RECURSIVE
すると 3 が返されます。
php://input
とは併用できませんenctype="multipart/form-data"
。http://php.net/manual/en/wrappers.php.php
この問題は PHP >= 5.3.9 でのみ発生するため、無名関数を使用できます。以下は、配列内の端子を再帰的にカウントします。
function count_terminals($a) {
return is_array($a)
? array_reduce($a, function($carry, $item) {return $carry + count_terminals($item);}, 0)
: 1;
}
function checkMaxInputVars()
{
$max_input_vars = ini_get('max_input_vars');
# Value of the configuration option as a string, or an empty string for null values, or FALSE if the configuration option doesn't exist
if($max_input_vars == FALSE)
return FALSE;
$php_input = substr_count(file_get_contents('php://input'), '&');
$post = count($_POST, COUNT_RECURSIVE);
echo $php_input, $post, $max_input_vars;
return $php_input > $post;
}
echo checkMaxInputVars() ? 'POST has been truncated.': 'POST is not truncated.';
error_get_last()
スクリプトでできるだけ早く呼び出します (エラーが発生する可能性がある前に、これがわかりにくくなります)。私のテストでは、該当する場合は max_input_vars 警告が表示されます。
max_input_vars を 100 に設定したテスト スクリプトを次に示します。
<?php
if (($error = error_get_last()) !== null) {
echo 'got error:';
var_dump($error);
return;
}
unset($error);
if (isset($_POST['0'])) {
echo 'Got ',count($_POST),' vars';
return;
}
?>
<form method="post">
<?php
for ($i = 0; $i < 200; $i++) {
echo '<input name="',$i,'" value="foo" type="hidden">';
}
?>
<input type="submit">
</form>
変数制限に達したときの出力:
got error:
array
'type' => int 2
'message' => string 'Unknown: Input variables exceeded 100. To increase the limit change max_input_vars in php.ini.' (length=94)
'file' => string 'Unknown' (length=7)
'line' => int 0
PHP 5.3.10 および Apache 2.2.22 を使用する Ubuntu でテスト済み。
安定性 (変更される可能性があります) と一般的な PHP の推奨事項を確認するために、このエラー文字列を明示的にチェックすることを躊躇します。このように、すべての PHP エラーを例外に変換することを好みます(個別のサブクラスはやり過ぎかもしれませんが、@
エラーを抑制できるため、この例が気に入っています) error_get_last()
。
このメソッドによってキャッチされる可能性のある他の実行前エラーがあるかどうかはわかりません。