繁体   English   中英

如何使用 JavaScript、Ajax 和 PHP 代码防止表单提交

[英]How do I prevent form submission with JavaScript, Ajax and PHP code

当 email 或用户名不可用(在数据库中找不到)或密码不匹配时,我想阻止表单提交。 (密码和“确认密码”不匹配)。

这里问了一个类似的问题: JavaScript code to stop form submit

建议是使用返回 boolean 值的 function 并使用它来确定是否应该提交表单。

我试图制作类似的 usimg ajax 但我无法从 function 中的 Ajax 返回值。

这是 PHP 代码,有助于检查 email 或用户名是否存在:

    if (isset($_POST['username_check'])) {
    $username = $_POST['username'];
    $stmt = $db->prepare("SELECT count(*) as cntUser FROM Users WHERE username = :username");
    $stmt->bindValue(':username', $username, PDO::PARAM_STR);
    $stmt->execute();
    $count = $stmt->fetchColumn();
    if($count > 0){
        echo "taken";
    } else {
        echo 'not_taken';
    }
    exit();
}
if (isset($_POST['email_check'])) {
    $email = $_POST['email'];
    $stmt = $db->prepare("SELECT count(*) as cntUser FROM Users WHERE email = :email");
    $stmt->bindValue(':email', $email, PDO::PARAM_STR);
    $stmt->execute();
    $count = $stmt->fetchColumn();
    if($count > 0) {
        echo "taken";
    } else {
        echo 'not_taken';
    }
    exit();
}

这是带有一些 javascript 的 HTML 代码:

        <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Register User</title>
    </head>
    <script>
// This code prints red or blue text on whether passwords match or not and return a boolean value
        var check = function() {
            var pass1 = document.getElementById("password").value;
            var pass2 = document.getElementById("password2").value;
            if (pass1 != "" && pass2 != "") {
                if (pass1 === pass2) {
                    document.getElementById('message').style.color = 'green';
                    document.getElementById('message').innerHTML = 'matching';
                    return true;
                } else {
                    document.getElementById('message').style.color = 'red';
                    document.getElementById('message').innerHTML = 'not matching';
                    return false;
                }
            }
            else document.getElementById('message').innerHTML = '';
            return false;
        }

    //If both passwords don't match, it should be impossible to submit form
       function validate(){
            var pass1 = document.getElementById("password").value;
            var pass2 = document.getElementById("password2").value;
            return check();
        }
    </script>
    <body>
    <h1>Register user</h1>
    <form method="post" id="register_form" onsubmit="return validate();">
        <label>Username:</label>
        <div id="error_msg"></div>
        <div>
        <br><input type="text" name="username" value="" placeholder="User name" maxlength=30 required id="username" />
        <span></span>
        </div>
        <div>
        <br><label>First Name:</label>
        <br><input type="text" name="firstname" value="" placeholder="First name" maxlength=45 required id="firstname" />
        <br><label>Last name:</label>
        <br><input type="text" name="lastname" value="" placeholder="Last name" maxlength=45 required id="lastname" />
            <div>
        <br><label>Epost:</label>
        <br><input type="email" name="email" value="" placeholder="Email" maxlength=45 required id="email" />
            <span></span>
        </div>
        <div>
        <br><label>Password: </label>
        <br><input type="password" name="password"  required id="password" placeholder="Password" maxlength=60 value="" onkeyup='check();'>
        <br><label>Confirm password:</label>
        <br><input type="password" name="password2" required id="password2" placeholder="Confirm Password" maxlength=60 value="" onkeyup='check();'/>
            <span></span><span id='message'></span>
        <input type="hidden" value="{{ getMac("Register") }}" name="XSRFPreventionToken">
        <br><input type="submit" name="register" id="reg_btn" value="Register"></form>
    <script src="../jquery-3.5.0.js"></script>
    <script src="../script.js"></script>
    </body>
    </html>

这是 script.js 上的 JavaScript 代码:

$('document').ready(function(){
    var result = false;
    var username_state = false;
    var email_state = false;
    var password_state = false;

    $('#username').on('blur', function(){
        var username = $('#username').val();
        if (username == '') {
            username_state = false;
            return;
        }
        $.ajax({
            url: 'process.php',
            type: 'post',
            data: {
                'username_check' : 1,
                'username' : username,
            },
            success: function(response){
                if (response == 'taken' ) {
                    username_state = false;
                    $('#username').parent().removeClass();
                    $('#username').parent().addClass("form_error");
                    $('#username').siblings("span").text('Sorry... Username already taken');
                }else if (response == 'not_taken') {
                    username_state = true;
                    $('#username').parent().removeClass();
                    $('#username').parent().addClass("form_success");
                    $('#username').siblings("span").text('Username available');
                }
            }
        });
    });
    $('#email').on('blur', function(){
        var email = $('#email').val();
        if (email == '') {
            email_state = false;
            return;
        }
        $.ajax({
            url: 'process.php',
            type: 'post',
            data: {
                'email_check' : 1,
                'email' : email,
            },
            success: function(response){
                if (response == 'taken' ) {
                    email_state = false;
                    $('#email').parent().removeClass();
                    $('#email').parent().addClass("form_error");
                    $('#email').siblings("span").text('Sorry... Email already taken');
                }else if (response == 'not_taken') {
                    email_state = true;
                    $('#email').parent().removeClass();
                    $('#email').parent().addClass("form_success");
                    $('#email').siblings("span").text('Email available');
                }
            }
        });
    });

//Check if everything is OK and submit form
    $('#reg_btn').on('click', function(){
        var username = $('#username').val();
        var email = $('#email').val();
        var password = $('#password').val();
        if (username_state == false || email_state == false) {
            $('#error_msg').text('Fix the errors in the form first');
            $("#register_form").submit(function(e){
                e.preventDefault();
            });
        } else $("#register_form").submit(function(e){
            e.submit();
        });
    });
});

当密码不匹配时,我可以阻止登录。 当 email 或用户名不可用时,我确实会收到消息。 但是当 email 或用户名不可用时,我无法阻止表单提交。 (提交时只给出错误消息,因为我的数据库表中有“PK”和“唯一键”,可以防止 email 和用户名重复)。

如果 (username_state == false || email_state == false),我如何防止表单提交?

您应该将侦听器设置为表单本身,而不是提交按钮。

    $("#form_id_here").submit(function(e){
         if (condition){
            e.preventDefault();
         }
    });

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM