Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/251.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php中的多个if语句?_Php_If Statement - Fatal编程技术网

php中的多个if语句?

php中的多个if语句?,php,if-statement,Php,If Statement,我有几个变量,我想在将它们写入mysql数据库之前验证它们。基本上,我想要以下逻辑:如果用户名是ok,电子邮件是ok,密码是ok,然后将所有内容写入数据库,否则会为每个内容抛出一个错误 我试图提出以下逻辑,但必须有一种更符合逻辑和更有效的方法(对不起,我知道这看起来很原始): 我认为一种更简短、可读性更强的方式是: if (!preg_match("/^[A-Za-z0-9]+(?:[ _-][A-Za-z0-9]+)*$/", $username)) die("username err

我有几个变量,我想在将它们写入mysql数据库之前验证它们。基本上,我想要以下逻辑:如果用户名是ok,电子邮件是ok,密码是ok,然后将所有内容写入数据库,否则会为每个内容抛出一个错误

我试图提出以下逻辑,但必须有一种更符合逻辑和更有效的方法(对不起,我知道这看起来很原始):


我认为一种更简短、可读性更强的方式是:

if (!preg_match("/^[A-Za-z0-9]+(?:[ _-][A-Za-z0-9]+)*$/", $username))
    die("username error");

if (!preg_match("^([0-9a-zA-Z]+[-._+&])*[0-9a-zA-Z]+@([-0-9a-zA-Z]+[.])+[a-zA-Z]{2,6}$", $email))
    die("email error");

if (/*password is NOT ok*/)
    die("password error");

//create user entry in the db
//and save success message in the session variable

请注意,我已经否定了您的条件,因此if语句的内容仅在发生故障时执行。

我认为一种更短、更可读的方法是:

if (!preg_match("/^[A-Za-z0-9]+(?:[ _-][A-Za-z0-9]+)*$/", $username))
    die("username error");

if (!preg_match("^([0-9a-zA-Z]+[-._+&])*[0-9a-zA-Z]+@([-0-9a-zA-Z]+[.])+[a-zA-Z]{2,6}$", $email))
    die("email error");

if (/*password is NOT ok*/)
    die("password error");

//create user entry in the db
//and save success message in the session variable

请注意,我已经否定了您的条件,因此if语句的内容仅在发生故障时执行。

理想情况下,您希望能够显示多条错误消息,以防出现多个错误。大概是这样的:

$errors = array();
if( !preg_match("/^[A-Za-z0-9]+(?:[ _-][A-Za-z0-9]+)*$/", $username) )
{
    $errors[] = 'Username was invalid';
}
if ((preg_match("^([0-9a-zA-Z]+[-._+&])*[0-9a-zA-Z]+@([-0-9a-zA-Z]+[.])+[a-zA-Z]{2,6}$", $email))
{
    $errors[] = 'Email was invalid';
}
if( /* Password is bad */ )
{
    $errors[] = 'Password is bad somehow';
}

if( sizeof($errors) == 0 )
{
    // write to db
}
else
{
    // Display all error messages
}

理想情况下,您希望能够显示多个错误消息,以防出现多个错误。大概是这样的:

$errors = array();
if( !preg_match("/^[A-Za-z0-9]+(?:[ _-][A-Za-z0-9]+)*$/", $username) )
{
    $errors[] = 'Username was invalid';
}
if ((preg_match("^([0-9a-zA-Z]+[-._+&])*[0-9a-zA-Z]+@([-0-9a-zA-Z]+[.])+[a-zA-Z]{2,6}$", $email))
{
    $errors[] = 'Email was invalid';
}
if( /* Password is bad */ )
{
    $errors[] = 'Password is bad somehow';
}

if( sizeof($errors) == 0 )
{
    // write to db
}
else
{
    // Display all error messages
}

首先,有很多框架和验证脚本允许您这样做。另一方面,如果您以后决定切换到一个框架,您最好自己完成这项工作,这样您就知道实际发生了什么

您的代码看起来不错,但从可用性的角度来看,它并没有人们希望的那么好。如果我试图在您的系统中创建一个用户,我可能需要填写表单并按提交几次,这可能会很烦人。相反,一旦填写了表单,就会显示错误列表,而不是一次只显示一个错误。处理此问题的常用方法是创建一个错误消息数组

实现可以是这样的

$errors = array();

if (!preg_match("/^[A-Za-z0-9]+(?:[ _-][A-Za-z0-9]+)*$/", $username))
    array_push($errors, "Invalid username");

if (!preg_match("^([0-9a-zA-Z]+[-._+&])*[0-9a-zA-Z]+@([-0-9a-zA-Z]+[.])+[a-zA-Z]{2,6}$", $email))
    array_push($errors, "Invalid password");

if (otherValidationRule())
    array_push($errors, "Something else went wrong");
在此之后,您将检查是否发生了任何错误,如果发生了,则将其打印出来

if (sizeof($errors) > 0) {
    print("<ul>\n");
    foreach($errors as $error)
        printf("<li>%s</li>\n", $error);
    print("</ul>\n");
}
else {
    // Proceed with registration
}
if(sizeof($errors)>0){
打印(“
    \n”); foreach($errors作为$error) printf(“
  • %s
  • \n”,$error); 打印(“
\n”); } 否则{ //进行注册 }
首先,有许多框架和验证脚本允许您执行此操作。另一方面,如果您以后决定切换到一个框架,您最好自己完成这项工作,这样您就知道实际发生了什么

您的代码看起来不错,但从可用性的角度来看,它并没有人们希望的那么好。如果我试图在您的系统中创建一个用户,我可能需要填写表单并按提交几次,这可能会很烦人。相反,一旦填写了表单,就会显示错误列表,而不是一次只显示一个错误。处理此问题的常用方法是创建一个错误消息数组

实现可以是这样的

$errors = array();

if (!preg_match("/^[A-Za-z0-9]+(?:[ _-][A-Za-z0-9]+)*$/", $username))
    array_push($errors, "Invalid username");

if (!preg_match("^([0-9a-zA-Z]+[-._+&])*[0-9a-zA-Z]+@([-0-9a-zA-Z]+[.])+[a-zA-Z]{2,6}$", $email))
    array_push($errors, "Invalid password");

if (otherValidationRule())
    array_push($errors, "Something else went wrong");
在此之后,您将检查是否发生了任何错误,如果发生了,则将其打印出来

if (sizeof($errors) > 0) {
    print("<ul>\n");
    foreach($errors as $error)
        printf("<li>%s</li>\n", $error);
    print("</ul>\n");
}
else {
    // Proceed with registration
}
if(sizeof($errors)>0){
打印(“
    \n”); foreach($errors作为$error) printf(“
  • %s
  • \n”,$error); 打印(“
\n”); } 否则{ //进行注册 }
您可以使用die来结束脚本

if (/*User name in NOT ok*/)
{
die("Bad username");
}

if(/*Password is not ok*/)
{
die("Bad Pass");
}
或者使用变量

$usernameOk = false;
$passwordOk = false;

if(/*Username is ok*/)
{
$username = true;
}

if(/*Password is ok*/)
{
$passwordOk = true;
}

if(/*username true and password true*/)
{
//Execute statement
}

您可以使用die结束脚本

if (/*User name in NOT ok*/)
{
die("Bad username");
}

if(/*Password is not ok*/)
{
die("Bad Pass");
}
或者使用变量

$usernameOk = false;
$passwordOk = false;

if(/*Username is ok*/)
{
$username = true;
}

if(/*Password is ok*/)
{
$passwordOk = true;
}

if(/*username true and password true*/)
{
//Execute statement
}


在我看来不错,tbh,虽然您可以避免嵌套ifsSo,但您的意思是最好这样做:如果((用户名可以)&&&&(电子邮件可以)&&&&(密码可以))?不是真的,因为这样您就无法分离错误,你所有的答案都避免了嵌套。@PartisanEntity我想他是说不要把一个
if
包含在另一个
if
块中。如果可以将条件链接到一个
,但是这样做会失去一些灵活性。@watcher:啊,谢谢你,我刚刚意识到,如果用户名未通过验证,并且会忽略所有其他验证,我的代码只会将用户名的错误消息发送给用户。我想这就是你的意思?在我看来很好tbh,虽然你可以避免嵌套ifsSo,但你的意思是最好这样做:如果((用户名可以)&&&(电子邮件可以)&&&(密码可以))?不是真的,因为这样你就无法分离错误,你所有的答案都避免了嵌套。@PartisanEntity我想他是说不要把一个
if
包含在另一个
if
块中。如果
可以将条件链接到一个
,但是这样做会失去一些灵活性。@watcher:啊,谢谢你,我刚刚意识到,如果用户名未通过验证,并且会忽略所有其他验证,我的代码只会将用户名的错误消息发送给用户。我想这就是你的意思?对不起,我可能会感到困惑,但我不认为“死”在我的情况下会起作用,因为这会停止整个脚本,对吗?关键是在这个php脚本的最顶端有一个header();它将用户转发回注册表,并显示一条错误消息或一条成功消息。@PartisanEntity:Wait,在脚本的最顶端使用
标题(“Location:xxx.php”)?一旦发送该头,您就无法确定服务器端脚本的其余部分是否会执行。如果我错了,并且您没有在脚本开头使用
header
重定向,那么您也许可以使用类似
die(header(“Location:xxx.php?error=username”)
并让您的注册表基于
$\u GET
@PartisanEntity创建错误消息您不必感到困惑,
die()
确实不是一个很好的解决方案。在我的世界里,通常
die()。即使是允许用户重试的表单,也不会生成有效的HTML标记,因为您没有终止任何已打开的HTML标记,例如
@Travesty3:我实际上使用的是标题(“Location:index.php”);在最顶端