如果else语句不起作用的多个条件

时间:2014-03-21 16:40:05

标签: php forms if-statement

if(isset($_POST['submitRegister'])) {

$username = $_POST['username'];
$password = $_POST['password'];
$password2 = $_POST['password2'];
$email = $_POST['email'];

if(!preg_match('#^[a-zA-Z0-9_-]+$#', $username))
    $error1 = 'Username can only contain: A-Z a-z 0-9 _ - ';

if(!isset($username) || empty($username))
    $error1 = 'Please enter your Username';


if(!preg_match("#[0-9]+#", $password))
    $error2 = 'Password must include at least one number';

if(!isset($password) || empty($password))
    $error2 = 'Please enter your Password';     


if($password != $password2)
    $error3 = 'Passwords do not match';

if(!isset($password2) || empty($password2))
    $error3 = 'Please confirm your Password';


if(!preg_match("#^[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,4}+$#", $email))
    $error4 = 'That e-mail does not appear to be valid';

if(!isset($email) || empty($email))
    $error4 = 'Please enter your E-mail address';       


if(!isset($_POST["terms"]))
    $error5 = 'You must accept the Terms and Conditions';

 else {

    require_once 'server.php';
    require_once 'dbconn.php';

}
}

我在让它正常工作方面遇到了一些麻烦。 如你所见,我有多个if条件。事实上还有一些,但我编辑它以使帖子更短。我经历了很多其他的事情,并且认为我理解它,但显然不是。

我的问题是,只要我不勾选术语复选框(最后一个if语句),一切正常。但是,如果勾选复选框,它将尝试连接到数据库,无论前面的字段是空还是没有正确填写。

在我的上一篇文章中,我把错误的顺序放在了错误的顺序(回到前面),我先将if语句放在首位,用户名放在最后。我认为这解决了它,但只要我输入用户名就可以连接,无论其他字段是否为空。所以在这种情况下不起作用。 希望有人可以提供帮助,非常感谢。

5 个答案:

答案 0 :(得分:1)

抱歉,我不太了解你的意图,但我可以告诉你,每次检查条款复选框时,下一个代码都是:

 require_once 'server.php';
 require_once 'dbconn.php';

将被执行。

如果您希望require_once语句仅在没有错误时执行,您可以这样做:

if (!$error1 && !$error2 && !$error3 && !$error4 && !$error5)
{
    require_once 'server.php';
    require_once 'dbconn.php';
}

我建议您在所有if语句中使用{}阻止。

答案 1 :(得分:0)

你不需要"否则"在这种情况下的最后一例。多个" if"这里的陈述可以匹配。最后一个("术语"一个)可以匹配,当且仅当它不匹配时," else"块被执行。你"否则" block是调用require_once的唯一部分。

如果删除其他内容,则应该开始工作。

答案 2 :(得分:0)

问题是else语句仅适用于最后一个if(是否检查条件)。

我建议你做一些事情:

if(isset($_POST['submitRegister'])) {

    $username = $_POST['username'];
    $password = $_POST['password'];
    $password2 = $_POST['password2'];
    $email = $_POST['email'];
    $valid = false;

    if(!preg_match('#^[a-zA-Z0-9_-]+$#', $username))
        $error1 = 'Username can only contain: A-Z a-z 0-9 _ - ';

    if(!isset($username) || empty($username))
        $error1 = 'Please enter your Username';


    if(!preg_match("#[0-9]+#", $password))
        $error2 = 'Password must include at least one number';

    if(!isset($password) || empty($password))
        $error2 = 'Please enter your Password';     


    if($password != $password2)
        $error3 = 'Passwords do not match';

    if(!isset($password2) || empty($password2))
        $error3 = 'Please confirm your Password';


    if(!preg_match("#^[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,4}+$#", $email))
        $error4 = 'That e-mail does not appear to be valid';

    if(!isset($email) || empty($email))
        $error4 = 'Please enter your E-mail address';       


    if(!isset($_POST["terms"]))
        $error5 = 'You must accept the Terms and Conditions';

    $valid = !(isset($error1) || isset($error2) || ...); //The number of possible errors

    if($valid)
     {

        require_once 'server.php';
        require_once 'dbconn.php';

    }
}

请注意,保存错误的另一种方法是将它们存储在数组中。

$errors = array();

if(/* Invalid username */)
    $errors[] = 'Invalid username'; //Add new error to the list

/*
...
*/

$valid = count($errors) === 0; //Valid if there is no error

答案 3 :(得分:0)

是的,让我们退后一步,看看if语句是如何工作的。

伪代码中的

if(statement){
    code1
}

code2

现在,如果statement是true,那么code1将执行,code2将执行。如果statement是false,则code1将不会执行,并且code2将执行,因为它不会被if语句块包含。因此,如果我们有:

,请将其应用于您的代码
if(!isset($email) || empty($email))
    $error4 = 'Please enter your E-mail address';

PHP的工作方式是,它允许你有一行而不需要大括号,但你可以假设它把它放在那里,这样看起来像这样:

if(!isset($email) || empty($email)){
    $error4 = 'Please enter your E-mail address';
}

那么问题出现了。无论if语句的结果如何,所有代码仍然会执行。怎么办?

好吧,你可以做一个大的嵌套if语句

if(statement1){
    if(statement2){
        if(statement3){
            ...
        }else{
            error
        }
    }else{
        error
    }
}else{
    error
}

但你可以看到这很快变得多么丑陋。

所以我们可以用多个条件做一个if语句,

if(statement1 and statement2 and statement3 and ...){
    code
}else{
    error
}

但是有很多陈述,就像你的陈述一样,也会很快变得难看。那又怎么样?使用elseifelseif仅在前一个if语句未执行时执行。

if(!statement1){
    error
}elseif(!statement2){
    error
}elseif(!statement3){
    error
}else{ //meaning no error was triggered
    code
}

另一种解决方案:在大多数语言中,有一些功能trycatch,这些功能证明是有用的。手表:

try{
    if(!statement1){
        throw exception
    }
    if(!statement2){
        throw exception
    }
    if(!statement3){
        throw exception
    }

    code
}catch(exception){
    throw error because <exception>
}

为什么这有用?如果抛出异常,try块中的代码将停止执​​行并立即转到catch块。这意味着你的所有代码都没有被执行(所以在你的情况下,你想要调用的那些错误实际上会被调用)。

那么,我的解决方案?将您的代码放入某些try - catch blocks

答案 4 :(得分:0)

if(!isset($_POST["terms"]))
    $error5 = 'You must accept the Terms and Conditions';

 else {

    require_once 'server.php';
    require_once 'dbconn.php';
}

if ... else阻止成对工作,此前的if语句都不会对else条件产生任何影响。从本质上讲,如果require_once 设置为,则会发生$_POST['terms']次调用 - 无论其他任何内容。

我认为你想要的更像是:

if(isset($_POST['submitRegister'])) {

    $username = $_POST['username'];
    $password = $_POST['password'];
    $password2 = $_POST['password2'];
    $email = $_POST['email'];

    //define errors, I'm going to put them into an array 
    // - it makes it easier to evaluate at the end
    $aErrors = array();

    if(!preg_match('#^[a-zA-Z0-9_-]+$#', $username)) {
        $aErrors['error_1'] = 'Username can only contain: A-Z a-z 0-9 _ - ';
    }
    elseif(!isset($username) || empty($username)) {
        $aErrors['error_1'] = 'Please enter your Username';
    }

    if(!preg_match("#[0-9]+#", $password)) {
        $aErrors['error_2'] = 'Password must include at least one number';
    }
    elseif(!isset($password) || empty($password)) {
        $aErrors['error_2'] = 'Please enter your Password';     
    }

    if($password != $password2) {
        $aErrors['error_3'] = 'Passwords do not match';
    }
    elseif(!isset($password2) || empty($password2)) {
        $aErrors['error_3'] = 'Please confirm your Password';
    }

    if(!preg_match("#^[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,4}+$#", $email)) {
        $aErrors['error_4'] = 'That e-mail does not appear to be valid';
    }
    elseif(!isset($email) || empty($email)) {
        $aErrors['error_4'] = 'Please enter your E-mail address';
    }

    if(!isset($_POST["terms"])) {
        $aErrors['error_5'] = 'You must accept the Terms and Conditions';
    }

    //if there are no errors
    if(!$aErrors) {
        require_once 'server.php';
        require_once 'dbconn.php';
    }
}