0

私が得ているもの:3つの警告(issetの不正なオフセットタイプまたは空の...)3つの通知(未定義のインデックス:...)

3つの警告は、最初のforeachで実現されます。そして、3つの通知は2番目のforeachループに関連しています。

私は自分が間違っていることを本当に理解していません...ここで助けが必要です。

<form name="form" action="index.php" method="POST">
    <input type="text" name="name" value="<?php if (isset($_POST['name'])) { echo $_POST['name']; } ?>" />
    <input type="text" name="age" value="<?php if (isset($_POST['age'])) { echo $_POST['age']; } ?>" />
    <input type="text" name="email" value="<?php if (isset($_POST['email'])) { echo $_POST['email']; } ?>" />
    <input type="submit" />
</form>

<?php
$expected = array(
    'name' => array("filter" => FILTER_SANITIZE_STRING),
    'age' => array("filter" => FILTER_SANITIZE_NUMBER_INT),
    'email' => array("filter" => FILTER_SANITIZE_EMAIL)
);

foreach ($expected AS $key => $value) {
    if (!isset($_POST[$value])) {
        echo "not set";
    } elseif (empty($_POST[$value])) {
        echo "empty";
    }
}

$result = filter_input_array(INPUT_POST, $expected);

foreach ($result AS $key => $value) {
    if (!$result[$value]) {
        echo "not valid value";
    }
}
?>

皆さん、ありがとうございました。

4

1 に答える 1

3

foreachare foreach($iterable as $value)との形式foreach($iterable as $key => $value)foreach ($iterable as $key)javascriptのような形式はありませんfor (key in obj)

代わりforeach ($expected as $key => $value) {foreach($result as $key=>$value) { if (!$value) die(false); }

完全なコードは次のようになります。

$expected = array(
    'name' => array("filter" => FILTER_SANITIZE_STRING),
    'age' => array("filter" => FILTER_SANITIZE_NUMBER_INT),
    'email' => array("filter" => FILTER_SANITIZE_EMAIL)
);

foreach ($expected AS $key => $value) {
    if (!isset($_POST[$key])) {  // NOT $value!!!!
        echo "not set";
    } elseif (empty($_POST[$key])) {
        echo "empty";
    }
}

$result = filter_input_array(INPUT_POST, $expected);

foreach ($result AS $key => $value) {
    if (!$result[$key]) {  // NOT $value!!!
        echo "not valid value";
    }
}

入力を検証することが目標である場合は、PHPのサニタイズメカニズムを多用しないことをお勧めします。すべてのPHPと同様に、入力を検証するのではなく、サニタイズするという根本的に破られた哲学に基づいています。ただし、他に何を使用するようにアドバイスするかはわかりません。尊重/検証は有望に見えますが、可能であればPHPを離れた方がよいと思います。

私たちが持っているものでやり遂げるには、FILTER_VALIDATE_*フィルターだけで次の関数を使用します。それでも前処理と後処理を行う必要があり、複数の呼び出しで「連鎖」フィルターをエミュレートする必要があります。

function filter_array($data, $filter) {
    $missing = array_diff_key($filter, $data);
    $filtered = filter_var_array($data, $filter);
    $invalid = array_filter($filtered, function($v){return $v===FALSE;});
    $filtered = array_diff_key($filtered, $missing, $invalid);
    return array($filtered, array_keys($invalid), array_keys($missing));
}

使用例:

$_POST = array('extra'=>'extra', 'age'=>array('30a'), 'name'=>'the name');

$expected = array(
    'name'   => array("filter" => FILTER_UNSAFE_RAW, // using this as a "passthrough" filter
                      "flags"  => FILTER_REQUIRE_SCALAR, // just to set this flag
    ),
    'age'   => array("filter"  => FILTER_VALIDATE_INT,
                     "flags"   => FILTER_REQUIRE_SCALAR,
                     "options" => array('min_range'=>0, 'max_range'=>120)
    ),
    'email' => array("filter"  => FILTER_VALIDATE_EMAIL,
                     "flags"   => FILTER_REQUIRE_SCALAR,
    ),
);

list($valid, $invalid, $missing) = filter_array($_POST, $expected);

var_export($valid); var_export($invalid); var_export($missing);
于 2012-12-26T19:33:03.440 に答える