嵌套ifs以捕获错误

时间:2014-07-08 20:42:37

标签: php if-statement

您可能知道这张图片:

enter image description here

假设我想通过各种方法验证单个用户输入 ,并且每个用户依赖取决于前一个的成功。如果筑巢,我怎么能避免这种情感和丑陋?

我无法想到其他方式,它会正确验证并在发生错误时返回正确的信息,但它确实看起来很丑陋并且可能会让人感到痛苦。

有什么想法吗?

5 个答案:

答案 0 :(得分:3)

到目前为止,我的经验表明,如果你对同一目标进行了超过4-5次验证,那么你很可能做错了什么。为了验证用户输入,你可能需要某些chars模式,你可以使用正则表达式来实现,你可能需要填充所有字段,一些奇特的东西,比如来自某个国家IP的用户或已经检查过至少18岁在下拉列表中。所有其他的事情,无论是对这些人来说,还是偶然的 - 他们都是多余的。

正如其他人所述,您也不应该嵌套块,但如果条件不满足则返回执行。

例如:

function isFormPopulated() {
    $requiredFields = array('user', 'pass', 'age', 'sex');
    foreach ($requiredFields as $field) {
        if (empty($_POST[$field])) { 
            $_SESSION['msg'] = $field . ' field should be populated'; // here better throw exception, instead of session saving the message
            return false;
        }
    }
    return true;
}

function isPatternValid() {
     $fieldPatterns = array('user' => '/w+/', 'pass' => 'someOtherRegex')
     foreach ($fieldPatterns as $field => $pattern) {
         if (!preg_match($pattern, $_POST[$field])) {
             return false;
         }
     }
     return true;
}

function isUserAllowed() {
    if (in_array($_SERVER['REMOTE_ADDR']......) {
        return false;
    }
    return true;
}

function isUserLegal() {
    if ($_POST['age'] < self::MIN_ALLOWED_AGE) {
        return false;
    }
    return true;
}

function isValid() {
     // here you can check with && the evaluation of the previous functions
     // or you can check one by one and return false aswell
     // return true at the end
}


function register() {
     if (!isValid()) {
         return false;
     }
     // continue execution of the registration process
}

在大多数情况下,验证用户输入并未在每种情况下耦合。例如。正则表达式条件与法律条件无关。但是,如果按设计(我假设错误)你有耦合。你可以链接验证,如

function validationFour() {
    if (!validationThree() || !current_validation) {
        return false;
    }
    return true;
}

function validationThree() {
    if (!validationTwo() || !current_validation) {
        return false;
    }
    return true;
}

答案 1 :(得分:2)

一个好的做法是防止深层嵌套的语句。所以最好找到负面条件,并立即处理它。例如:

if(!$_POST['user_name']){
    // exit
}

if(!$_POST['password']){
    // exit
}

// if we get to here, we assume all previous checks passed

这会创建干净的代码,因为深层嵌套的代码难以维护,并且一旦找到它就会处理条件。

答案 2 :(得分:0)

您可以使用try / catch块并在验证失败时抛出异常。例如:

try {
  if (!$_POST['user_name']) {
    throw new Exception('Invalid username');
  }

  if (!$_POST['user_password_new']) {
    throw new Exception('Invalid password');
  }

} catch (Exception $e) {
  echo 'Caught exception: ',  $e->getMessage(), "\n";
}

答案 3 :(得分:0)

if (!$_POST['user_name']) {
    $_SESSION['msg'] = 'Empty Username';
    return register_form();
}

if (!$_POST['user_password_new']) {
    $_SESSION['msg'] = 'Empty Password';
    return register_form();
}

...

create_user();
...

答案 4 :(得分:0)

根据以下声明,您似乎可以将它们叠加起来,并在前一个失败时立即返回。如果前一个成功,则可以安全地执行下一次检查。

  

每一个都取决于前一个的成功