4

E_WARNINGがPHPによって生成されることを知っています

PHP 警告: 不明: 入力変数が 1000 を超えました

しかし、スクリプトでこれを検出するにはどうすればよいでしょうか?

4

6 に答える 6

12

「十分に近い」方法は、チェックすることですif( count($_POST, COUNT_RECURSIVE) == ini_get("max_input_vars"))

これは、POST vars の数がたまたま制限に達した場合に誤検出を引き起こしますが、デフォルトの制限が 1000 であることを考慮すると、問題になることはまずありません。

于 2012-08-29T01:55:54.827 に答える
4

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;
}
于 2015-01-31T13:26:29.510 に答える
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.';
于 2012-08-30T19:54:10.960 に答える
0

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()

このメソッドによってキャッチされる可能性のある他の実行前エラーがあるかどうかはわかりません。

于 2014-02-06T11:16:08.090 に答える