您可能知道这张图片:
假设我想通过各种方法验证单个用户输入 ,并且每个用户依赖取决于前一个的成功。如果筑巢,我怎么能避免这种情感和丑陋?
我无法想到其他方式,它会正确验证并在发生错误时返回正确的信息,但它确实看起来很丑陋并且可能会让人感到痛苦。
有什么想法吗?
答案 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)
根据以下声明,您似乎可以将它们叠加起来,并在前一个失败时立即返回。如果前一个成功,则可以安全地执行下一次检查。
每一个都取决于前一个的成功