2012-12-26 56 views
0

我越来越: 3警告(非法抵消类型isset或空的...) 3通知书(未定义指数:...)的foreach和数组地图错误

3个警告realated与第一个foreach。 3通知与第二个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"; 
    } 
} 
?> 

谢谢大家。

+0

什么是错误的结果,并且能有什么办法? – Ryan

+0

在'foreach'中,你为什么期望'$ key'既是一个值又是一个关键? – DCoder

+0

我希望循环遍历第一个foreach中的数组,并在将值赋给$ expected数组索引之前验证$ _POST索引是否为空/空...如果成功,我想分析值并验证是否有效。 – obinoob

回答

3

foreach的形式是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的sanitize机制。像所有的PHP,它建立在消毒输入而不是验证它的基本破碎的哲学上。不过,我不确定还有什么建议你使用。 Respect/Validation看起来很有前途,但我认为如果可以的话,你最好离开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); 
+0

我明白但也不工作,我已经更新了我的代码,以获得更可读的内容,谢谢。 – obinoob

+0

你仍然对关键和值感到困惑。我已经用完整的更正后的代码更新了我的答案,但我不会按照您所做的那样来完成。如果你想等一会儿,我会更新答案,我会如何做到这一点。 –

+0

好吧,我明白,它可能不是最好的方式来做到这一点。我对foreach $ key和$ value ...感到困惑:D – obinoob