当只需要检查数组的某些键/值时该怎么办?

时间:2015-11-09 19:08:31

标签: php arrays

我有大量的表单字段(最后计数为34)遍布整个网站,所以我写了一个尽可能多的东西来进行批量验证,然后我会处理一个不太常见的项目。执行基础。

某些 $_POST键上,我需要检查该值是否为字母数字。

例如,需要检查$_POST['username']$_POST['firstname']不需要检查,因为它只能是字母(我们稍后会检查)。

我打算做类似下面的事情,但似乎我通过skippng这么多来创造很多开销,并且只检查5或6个值。

foreach($_POST as $key => $value){
        if($key == 'descr'){ continue; }
        if($key == 'imageUploads'){ continue; }
        // etc
        // etc
        // etc

        if(!ctype_alnum($value)){
             $notAlNum[] = $key.' is not alphnumeric;
        }
    }

有没有其他方法可以做到这一点,而没有循环遍历整个post数组?

从答案拼凑起来这是我提出的解决方案,它很难看,但它确实有效。

if(in_array($_POST['userName'] || $_POST['pswd'] || $_POST['oldpswd'] || $_POST['activationCode'],$_POST)){

        $toCheck = array($_POST['userName'],$_POST['pswd'],$_POST['oldpswd'],$_POST['activationCode']);

        foreach($toCheck as $key => $var) {
            if(empty($var)){ continue; }
            if(!ctype_alnum($var)){
                 $errormsg[] = $var.' is not alphnumeric';
            }
        }
    }

3 个答案:

答案 0 :(得分:2)

只检查那几个变量

$toCheck = array('firstVar2Check','secondVar2Check',...);
foreach($toCheck as $var) {
    if(!ctype_alnum($_POST[$var])){
         $notAlNum[] = $var.' is not alphnumeric';
    }
}

答案 1 :(得分:1)

您可以使用PHP的filter_input功能,而不是直接访问$ _POST。这允许您清理和验证数组的内容(例如,它是否是字母数字),并且通常被认为比直接访问数组更安全。例如:

$user = filter_input(INPUT_POST, 'user', FILTER_VALIDATE_REGEXP, ['options' => [
        'regexp' => '/[a-z_\-0-9]/i']
    ]);

这确实意味着遵循与上面描述的模式略有不同的模式 - 现在您将在获取每个POST变量时进行验证。您只需要为每个变量决定如何进行santitize /过滤。

答案 2 :(得分:0)

为什么不创建要检查的键数组? e.g。

foreach([ 'username' => true, 'otherField' => false ] as $field => $required) {
   if ((!isset($_POST[$field]) || strlen($_POST[$field])) == 0 && !$required) continue;
   if (!isset($_POST[$field]) || strlen($_POST[$field]) == 0) {
      $errors[] = "$field is required";
   } 
   else if (!ctyle_alnum($_POST[$field])) {
      $errors[] = "$field is not alphanumeric";
   }
}

然后你不会浪费时间处理无关的数据