【问题标题】:how to validate one variable either of two variables in php如何在php中验证两个变量中的一个变量
【发布时间】:2018-10-10 11:14:34
【问题描述】:

我有两个变量 mobile 和 email 现在我想验证两者但我希望用户将其中一个字段留空如果用户没有前一个字段如果用户不想注册他的电子邮件那么他可以转到手机号码进行注册,反之亦然这是我的验证码

<?php

$emailError    = "";
$fullnameError = "";
$usernameError = "";
$passwordError = "";
$mobileerror = "";
$errors        = 0;

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

    $email    = strip_tags($_POST['email']);
    $fullname = strip_tags($_POST['fullname']);
    $username = strip_tags($_POST['username']);
    $password = strip_tags($_POST['password']);
    $mobile = strip_tags($_POST['mobile']);



    $fullname_valid = $email_valid = $mobile_valid = $username_valid = $password_valid = false;



    if (!empty($fullname)) {

        if (strlen($fullname) > 2 && strlen($fullname) <= 30) {
            if (!preg_match('/[^a-zA-Z\s]/', $fullname)) {
                $fullname_valid = true;

                # code...
            } else {
                $fullnameError = "fullname can contain only alphabets <br>";
                $errors++;
            }
        } else {
            $fullnameError = "fullname must be 2 to 30 char long <br>";
            $errors++;
        }
    } else {
        $fullnameError = "fullname can not be blank <br>";
        $errors++;
    }



        if (filter_var($email, FILTER_VALIDATE_EMAIL)) {

            $query2 = "SELECT email FROM users WHERE email = '$email'";
            $fire2 = mysqli_query($con, $query2) or die("can not fire  query" . mysqli_error($con));
            if (mysqli_num_rows($fire2) > 0) {
                $emailError = $email . "is already taken please try another one<br> ";
            } else {
                $email_valid = true;
            }
            # code...
        } else {
            $emailError = $email . "is an invalid email address <br> ";
            $errors++;
        }
        # code...

   if ($mobile) {
      $query4 = "SELECT mobile FROM users WHERE mobile = '$mobile'";
            $fire4 = mysqli_query($con, $query4) or die("can not fire  query" . mysqli_error($con));
            if (mysqli_num_rows($fire4) > 0) {
                $mobileerror =  "is already taken please try another one<br> ";
            } else {
                $mobile_valid = true;
            }
   }

    if (!empty($username)) {

        if (strlen($username) > 4 && strlen($username) <= 15) {
            if (!preg_match('/[^a-zA-Z\d_.]/', $username)) {


                $query = "SELECT username FROM users WHERE username = '$username'";
                $fire = mysqli_query($con, $query) or die("can not fire  query" . mysqli_error($con));


                if (mysqli_num_rows($fire) > 0) {
                    $usernameError = '<p style="color:#cc0000;">username already taken</p>';
                    $errors++;
                } else {
                    $username_valid = true;
                }

            } else {
                $usernameError = "username can contain only alphabets <br>";
                $errors++;
            }
        } else {
            $usernameError = "username must be 4 to 15 char long <br>";
            $errors++;
        }
    } else {
        $usernameError = "username can not be blank <br>";
        $errors++;
    }

    if (!empty($password)) {
        if (strlen($password) >= 5 && strlen($password) <= 15) {
            $password_valid = true;
            $password       = md5($password);

            # code...
        } else {
            $passwordError = $password . "password must be between 5 to 15 character long<br>";
            $errors++;
        }
        # code...
    } else {
        $passwordError = "password can not be blank <br>";
        $errors++;
    }

    //if there's no errors insert into database
    if ($errors <= 0) {
        if ($fullname_valid && ($email_valid || $mobile_valid )&& $password_valid && $username_valid) {
            $query = "INSERT INTO users(fullname,email,username,password,avatar_path) VALUES('$fullname','$email','$username','$password','avatar.jpg')";
            $fire = mysqli_query($con, $query) or die("can not insert data into database" . mysqli_error($con));
            if ($fire) {


                header("Location: dashboard.php");
            }
        }

    }
}
?>

现在,当我使用电子邮件并将手机留空时,代码可以正常工作,但是当我使用电子邮件并将手机留空时,会出现错误如何解决此问题

【问题讨论】:

  • strip_tags 视为清理用户输入的有效手段通常是值得怀疑的,但当应用于密码时,它就变成了彻头彻尾的愚蠢。

标签: php forms validation


【解决方案1】:

再使用一个标志 $isValid_email_mobile = FALSE;

当控制流进入if (filter_var($email, FILTER_VALIDATE_EMAIL)) 然后在成功时设置 $isValid_email_mobile = TRUE;如果控制在 SUCCESS 上再次进入条件if ($mobile) 将相同,将其设置为$isValid_email_mobile = TRUE;

当 $isValid_email_mobile = FALSE 时;变为 TRUE 则您知道该字段/变量已通过您的要求并准备好进行 DB INSERT

然后

在您尝试插入时的最后一个IF 条件中,只需将IF 条件更改为以下

IF ($fullname_valid &&  $isValid_email_mobile && $password_valid && $username_valid)

另外一件事情,每当你使用标志逻辑时,总是在使用它之前将你的标志设置为某个默认值。

【讨论】:

    【解决方案2】:

    现在,当我使用电子邮件并将手机留空时,代码可以正常工作,但是当我使用电子邮件并将手机留空时,就会发生错误

    你有:

    if (!empty($fullname)) {}
    if (filter_var($email, FILTER_VALIDATE_EMAIL)) {}
    if ($mobile) {}
    if (!empty($username)) {}
    if (!empty($password)) {}
    

    要消除错误,请尝试添加

    if (!empty($mobile)) {
    

    另外,我建议对语句进行更多的包装。你只需要一个失败就可以停止输入。你可以这样做:

    $mobileOrEmail = false;
    if (!empty($fullname) && !empty($username) && !empty($password) {
      //check fullname, username and password
      if (!empty($mobile) {
        //check mobile, if it passes
        $mobileOrEmail = true;
      }
      if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
        //check email, if it passes
        $mobileOrEmail = true;
      }
      if (!$mobileOrEmail) $errors++;
    } else {
      //missing input values
      $errors++;
    }
    

    就个人而言,我会为每个输入字段创建一个函数。

    function checkUsername($username){
      //check username
      return true;
    }
    function checkEmail($email) {
      //check email
      return true;
    }
    ....
    

    然后你可以运行

    if (checkUsername($username) && checkPassword($password)
        && checkFullname($fullname) && (checkEmail($email) || checkEmail($email)) {
        //user input correct
     } else {
       //user input failed
     }
    

    只是为了给它更多的结构

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-01-20
      • 1970-01-01
      • 2019-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-29
      相关资源
      最近更新 更多