Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PHP - Avoiding nested if statements - cleaner way to code this

Assume that I am creating a registration form. I have code like the below and it is hard to manage because of all the nested if statements.

I want to know the cleanest and easiest to follow way to write code that functions similarly to what I have below.

EDIT: People have told me that I can move the empty($_POST['email']) to the validation functions. I can't do that because I need to know 1) whether user has posted data or not, and 2) whether the data user posted is valid.

For example, when the user first goes to the registration page, they have not posted any data so $_POST['email'] will generate PHP warnings because they don't exist. That's why I check whether data has been posted before I validate.

Does this make sense?

function validate_email($str) {
    $str = trim(strtolower($str));
    if(!filter_var($str, FILTER_VALIDATE_EMAIL)) {
      return false;
    } else {
      return $str;
    }
}

function validate_password($str) {
    $str = trim($str);
    if(strlen($str) < 5 || strlen($str) > 70) {
        return false;
    } else {
        return $str;
    }
}

$email = false;
$password = false;
$errorMessage = false;

if(!empty($_POST['email'])) {
    $email = validate_email($_POST['email']);
    if($email) {
        if(!empty($_POST['password'])) {
            $password = validate_password($_POST['password']);
            if($password) {
                createNewUser($email,$password);
            } else {
                $errorMessage = "The password is not valid";
            }
        } else {
            $errorMessage = "The password is not valid";
        }
    } else {
        $errorMessage = "Email address is invalid";
    }
} else {
    $errorMessage = "Email address is invalid";
}

if($errorMessage) echo $errorMessage;
like image 202
fun_programming Avatar asked May 17 '26 02:05

fun_programming


1 Answers

Whenever you have nested if()s you can flip the logic "inside out":

if (A)
  if (B)
    if (C)
      final()

change to:

 if (!A) return
 if (!B) return
 if (!C) return
 final()

In your case instead of returning you could throw an exception.

try {
  validateAndCreateNewUser();
}
catch(ValidationError $e) {
  display($e->getMessage());
}
like image 67
Kornel Avatar answered May 19 '26 16:05

Kornel



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!