Php 多条件if-else语句不起作用

Php 多条件if-else语句不起作用,php,forms,if-statement,Php,Forms,If Statement,我很难让它正常工作。 正如你所看到的,我有多个if条件。事实上,还有一些,但我已经编辑了它,使这篇文章短了一点。我已经经历了很多“如果其他”的啧啧声,我想我明白了,但显然不明白 我的问题是,只要我不勾选terms复选框(最后一个if语句),一切都正常。但是如果我勾选该复选框,它将尝试连接到数据库,不管前面的字段是空的还是填写不正确 回想我的上一篇文章,我把我的ifs放在了错误的顺序(从后到前),我把术语的if语句放在第一位,用户名放在最后一位。我认为这解决了问题,但只要我输入用户名,它就会连接,

我很难让它正常工作。 正如你所看到的,我有多个if条件。事实上,还有一些,但我已经编辑了它,使这篇文章短了一点。我已经经历了很多“如果其他”的啧啧声,我想我明白了,但显然不明白

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

回想我的上一篇文章,我把我的ifs放在了错误的顺序(从后到前),我把术语的if语句放在第一位,用户名放在最后一位。我认为这解决了问题,但只要我输入用户名,它就会连接,不管其他字段是否为空。所以在这种情况下,这不起作用。 希望有人能帮助你,非常感谢。

在这种情况下,你不需要“其他人”在最后一种情况下。这里的多个“if”语句可以匹配。最后一个(术语)可以匹配,当且仅当它不匹配时,执行“else”块。您的“else”块是唯一调用require\u一次的部分


如果您删除了else,它应该开始工作。

很抱歉,我不太理解您的意图,但我可以告诉您,每次您选中“术语”复选框时,下一个代码:

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';

}
}
将被执行

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

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

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

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

我建议你做一些类似的事情:

if (!$error1 && !$error2 && !$error3 && !$error4 && !$error5)
{
    require_once 'server.php';
    require_once 'dbconn.php';
}
请注意,保存错误的另一种方法是将它们存储在数组中

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
现在,若语句为
true
,则将执行code1,并执行code2。如果语句为
false
,则代码1将不执行,而代码2将无论如何执行,因为它不包含在if语句块中。因此,如果我们有:

if(statement){
    code1
}

code2
PHP的工作方式是,它允许您在不需要花括号的情况下使用一行,但您可以假设它将它放在那里,这样看起来就像这样:

 require_once 'server.php';
 require_once 'dbconn.php';
if(!isset($email) || empty($email))
    $error4 = 'Please enter your E-mail address';
于是问题出现了。不管if语句的结果如何,它后面的所有代码都将继续执行。那你怎么办

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

if(!isset($email) || empty($email)){
    $error4 = 'Please enter your E-mail address';
}
但你可以看到这很快变得多么丑陋

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

if(statement1){
    if(statement2){
        if(statement3){
            ...
        }else{
            error
        }
    }else{
        error
    }
}else{
    error
}
但是,像你这样的大量陈述也很快变得丑陋。那你怎么办?使用
elseif
elseif
仅在未执行上一条if语句时执行

if(statement1 and statement2 and statement3 and ...){
    code
}else{
    error
}
另一个解决方案是:在大多数语言中,有两个函数,
try
catch
,它们被证明是有用的。观察:

if(!statement1){
    error
}elseif(!statement2){
    error
}elseif(!statement3){
    error
}else{ //meaning no error was triggered
    code
}
试试看{
如果(!语句1){
抛出异常
}
如果(!语句2){
抛出异常
}
如果(!语句3){
抛出异常
}
代码
}捕获(例外){
抛出错误,因为
}
这为什么有用?如果抛出异常,try块中的代码将停止执行,并立即转到catch块。这意味着所有其余的代码都不会被执行(因此在您的情况下,您想要调用的错误实际上会被调用)

那么,我的解决方案呢?将您的代码放入一些

如果。。。else
块成对工作,此块前面的
if
语句对else条件没有任何影响。本质上,如果设置了
$\u POST['terms']
,则这些
require\u once
调用将发生,而不考虑其他任何事情

我认为你想要的更像是:

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

 else {

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

快速看一眼,我怀疑你想要
elseif
在那里……如果“用户将垃圾数据输入表单”符合例外情况,你必须生活在一个特别田园诗般的世界里——对我来说,这更像是日常发生的事情:\n我喜欢例外情况。保持整洁,我可以报告错误,并提供错误消息和不同类型错误的代码。这是非常例外的。例外情况是好的,大家都同意。我只是不相信web表单上糟糕的用户输入符合您不愿意(或无法)允许该方法恢复的条件(理想情况下,您的应用程序不应该抛出异常,这意味着出现了问题)。但对于最初的问题,在第一个输入错误上抛出异常将不允许记录后续错误并向用户报告-很可能所有5个错误都会同时发生,因此所有5个错误都应该同时报告。感谢您的深入回复。这表明,给猫剥皮的方法肯定不止一种!elseif的问题是,它一次只给我errors 1字段,这意味着在它告诉我密码中的错误之前,我必须对username中的错误进行排序。虽然它有效,但并不完全是我想要的。非常感谢:)我同意这个答案,因为它只需要我添加一行代码。非常感谢你的帮助。只是对你的回答表示感谢。我目前正在学习数组教程,因为这是我在项目中绝对需要的东西。顺便说一句,如果(!isset($var)| empty($var)),那么使用
是毫无意义的,因为empty会计算是否设置了变量。。。只要使用
if(empty($var))
您是正确的,删除else将使其工作,这意味着它将连接到我的数据库。但即使字段为空,它也会这样做,如果包含恶意代码,情况更糟