PHP表单验证重叠

时间:2018-04-14 20:34:52

标签: php validation

我有一个php表单验证的问题,它工作正常,但它没有按预期工作,现在我有两种类型的PHP表单验证正在使用,一个是检查四个字段是否有数据在其中,另一个是检查电子邮件字段是否使用了正确的格式。

我遇到的问题是,如果我不做任何字段并点击提交,我希望"做这四个字段"弹出错误信息,但是电子邮件验证确实如此,如果我发电子邮件正常,则弹出所需的字段消息,这不是我想要的。

代码,我知道对于验证电子邮件,if语句中没有代码,我真的不知道该放什么

        //Check if these fields have data in them
    if(isset($_POST['email']) || isset($_POST['password']) || isset($_POST['confirm']) || isset($_POST['username'])   ){
        if(!$_POST['email'] || !$_POST['password']  || !$_POST['confirm'] || !$_POST['username']   ){
            $error = "Error. Please write in all required fields with the * symbol";
        }

        // Validate email format
        //https://www.w3schools.com/php/php_form_url_email.asp
        if (filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) {
        } else {
            $error = "Error. Please write in the correct E-Mail format";
        }

EDIT 只是想澄清一下,我尝试将验证电子邮件代码移到检查代码上方,但是当用户输入表单以写入所有必填字段时,它会保持一个持续的错误消息

整个PHP

    <?php

    //Check if these fields have data in them
    if(isset($_POST['email']) || isset($_POST['password']) || isset($_POST['confirm']) || isset($_POST['username'])   ){
        if(!$_POST['email'] || !$_POST['password']  || !$_POST['confirm'] || !$_POST['username']   ){
            $error = "Error. Please write in all required fields with the * symbol";
        }

        // Validate email format
        //https://www.w3schools.com/php/php_form_url_email.asp
        if (filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) {
        } else {
            $error = "Error. Please write in the correct E-Mail format";
        }


        if(!$error){
            //No errors - let’s create the account
            //Encrypt the password with a salt
            $encryptedPass = password_hash($_POST['password'], PASSWORD_DEFAULT);
            //Insert DB
            $query = "INSERT INTO users (user_email, user_password, user_forename, user_lastname, user_name, user_gender, user_country, user_number) VALUES (:email, :password, :firstname, :lastname, :username, :gender, :country, :mobile)";
            $result = $DBH->prepare($query);
            $result->bindParam(':username', $_POST['username']);
            $result->bindParam(':firstname', $_POST['firstname']);
            $result->bindParam(':lastname', $_POST['lastname']);
            $result->bindParam(':email', $_POST['email']);
            $result->bindParam(':gender', $_POST['gender']);
            $result->bindParam(':country', $_POST['country']);
            $result->bindParam(':mobile', $_POST['mobile']);
            $result->bindParam(':password', $encryptedPass);

            if($result->execute()){
                echo '<div class="alert alert-success" role="alert">Registration Successful!</div>';
                echo "<script> window.location.assign('index.php?p=login'); </script>";
            }
        }

HTML

<div class="row">
        <div class="main-login main-center">
            <h1>Register</h1>
            <form action="index.php?p=register" method="post">

                <?php if($error){
                    echo '<div class="alert alert-danger" role="alert">
                    <span class="glyphicon glyphicon-exclamation-sign" aria-hidden="true"></span>
                    <span class="sr-only">Error:</span>
                    '.$error.'
                    </div>';
                } ?>

                <p>
                    * Required Fields
                </p>

                <div class="form-group">
                    <label for="email" class="cols-sm-2 control-label">* Username</label>
                    <div class="cols-sm-10">
                        <div class="input-group">
                            <span class="input-group-addon"><i class="fa fa-user fa" aria-hidden="true"></i></span>
                            <input type="text" class="form-control" name="username" id="username"  placeholder="Username"/>
                        </div>
                    </div>
                </div>

                <div class="form-group">
                    <label for="email" class="cols-sm-2 control-label">* E-Mail Address</label>
                    <div class="cols-sm-10">
                        <div class="input-group">
                            <span class="input-group-addon"><i class="fa fa-envelope fa" aria-hidden="true"></i></span>
                            <input type="text" class="form-control" name="email" id="email"  placeholder="example@hotmail.com"/>
                        </div>
                    </div>
                </div>

                <div class="form-group">
                    <label for="password" class="cols-sm-2 control-label">* Password</label>
                    <div class="cols-sm-10">
                        <div class="input-group">
                            <span class="input-group-addon"><i class="fa fa-lock fa-lg" aria-hidden="true"></i></span>
                            <input type="password" class="form-control" name="password" id="password"  placeholder="Password"/>
                        </div>
                    </div>
                </div>

                <div class="form-group">
                    <label for="confirm" class="cols-sm-2 control-label">* Confirm Password</label>
                    <div class="cols-sm-10">
                        <div class="input-group">
                            <span class="input-group-addon"><i class="fa fa-lock fa-lg" aria-hidden="true"></i></span>
                            <input type="password" class="form-control" name="confirm" id="confirm"  placeholder="Confirm Password"/>
                        </div>
                    </div>
                </div>

                <div class="form-group">
                    <label for="email" class="cols-sm-2 control-label">First Name</label>
                    <div class="cols-sm-10">
                        <div class="input-group">
                            <span class="input-group-addon"><i class="fa fa-user-circle fa" aria-hidden="true"></i></span>
                            <input type="text" class="form-control" name="firstname" id="firstname"  placeholder="First Name"/>
                        </div>
                    </div>
                </div>

                <div class="form-group">
                    <label for="email" class="cols-sm-2 control-label">Last Name</label>
                    <div class="cols-sm-10">
                        <div class="input-group">
                            <span class="input-group-addon"><i class="fa fa-user-circle fa" aria-hidden="true"></i></span>
                            <input type="text" class="form-control" name="lastname" id="lastname"  placeholder="Last Name"/>
                        </div>
                    </div>
                </div>

                <div class="form-group">
                    Gender:
                    <div class="btn-group btn-group-toggle" data-toggle="buttons">
                        <label class="btn btn-outline-info active">
                            <!-- This button is checked by default for the user  -->
                            <input type="radio" name="gender" id="gender_male" value="Male" autocomplete="off" checked=""> Male
                        </label>

                        <label class="btn btn-outline-info">
                            <input type="radio" name="gender" id="gender_female"  value="Female" autocomplete="off"> Female
                        </label>
                    </div>
                </div>

                <div class="form-group">
                    <label for="address" class="cols-sm-2 control-label">Country</label>
                    <div class="cols-sm-10">
                        <div class="input-group">
                            <span class="input-group-addon"><i class="fa fa-address-card" aria-hidden="true"></i></span>
                            <input type="text" class="form-control" id="placesSearch" placeholder="Country" name="country">
                        </div>
                    </div>
                </div>

                <div class="form-group">
                    <label for="mobile" class="cols-sm-2 control-label">Mobile Number</label>
                    <div class="cols-sm-10">
                        <div class="input-group">
                            <span class="input-group-addon"><i class="fa fa-phone fa-lg" aria-hidden="true"></i></span>
                            <input type="mobile" class="form-control" name="mobile" id="mobile"  placeholder="Mobile Number"/>
                        </div>
                    </div>
                </div>

                <div align="center" class="checkbox">
                    <label><input type="checkbox" value=""> Sign up for BakeryUp Newsletters!</label>
                </div>

                <div class="form-group ">
                    <button type="submit" class="btn btn-success btn-lg btn-block login-button">Join</button>
                </div>
                <div align="center">
                    By clicking 'Join' you are agreeing to our Terms and Conditions, Cookie Policy and Privacy Policy.
                </div>
            </form>
        </div>
    </div>

2 个答案:

答案 0 :(得分:0)

尝试这种方法

$required = ['email','password','confirm','username'];
$countFieldFilled = 0;

foreach($_POST as $key => $value) {
    if (!empty($value)) {
        $countFieldFilled++;
    }
}

$postedKeys = array_keys($_POST);

if (count($_POST) > 0) {
    if ($countFieldFilled >= 4 && count(array_intersect($required,$postedKeys)) >= 4) {
        if (filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) {
        //all ok !
        } else {
            $error = "Error. Please write in the correct E-Mail format";
        }
    } else {
        echo 'not all required fields entered';
    }
}

答案 1 :(得分:0)

<?php
if($_SERVER['REQUEST_METHOD']=='POST')
{
    $fields = ['email', 'password', 'confirm', 'username'];
    foreach($fields as $name)
        $input[$name] = $_POST[$name] ?? '';
    // All fields require a value.
    foreach($input as $k => $v)
        if($v == '')
            $errors[$k] = 'Field required.';
    // Check valid email.
    if(
        $input['email'] &&
        filter_var($input['email'], FILTER_VALIDATE_EMAIL) === false
    )
        $errors['email'] = 'Email invalid.';
    // Check passwords match.
    if(
        $input['password'] && $input['confirm']
        && $input['password'] != $input['confirm']
    )
        $errors['password'] = $errors['confirm'] = 'Passwords must match.';

    if(!count($errors)) {
        // All good.
    } else {
        var_dump($errors);
    }
}