jquery ajax 提交在验证后总是以成功的方式返回


jquery ajax submit always comes back as successful after validation

我使用 jquery validate 创建了一个表单。表单会正确验证,一旦每个字段都被验证为正确,它就应该通过 ajax 提交。这就是问题出现的地方。我故意为数据库设置了不正确的登录详细信息,因此我希望 ajax 提交返回错误,但它总是以成功返回(debug() 确认连接到数据库时出现问题)。我也使用了正确的凭据,它会提交到数据库,并使用相同的"成功"警报消息进行回复。

下面是相关代码:

$("#form1").validate({
        ignore: "hidden:not(select)",
        rules: {
            //custom rules
        },
        messages:{
            //custom messages
        },
        errorPlacement: function(error, element) {
            //custom error placement
        },
        submitHandler: function(form){
                $.ajax({
                url: "submitForm.php",
                type: "post",
                data: $(form).serialize(),
                success: function(){
                    alert("successful");
                },
                error: function(jq,status,message){
                    alert("failed");
                }
            });
            return false;
        }
    });

您仍然得到"成功"的原因是 PHP 发送200响应,以便浏览器显示 PHP 错误,success:处理程序检查200响应。

如果 PHP 没有发送200响应,那么您将永远不会看到 PHP 错误。

理想的解决方案是执行服务器端验证查询是否成功,然后将自定义成功和错误响应发送回 AJAX 的成功处理程序。

下面是一个快速的肮脏演示

阿贾克斯

$.ajax({
    url: "submitForm.php",
    type: "post",
    data: $(form).serialize(),
    dataType: 'json'
    success: function(data){
        alert(data['success']+' : '+data['message']);
        if(data['success']){
            // do successful things
        }
        else{
            // do failure things
        }
    },
    error: function(jq,status,message){
        alert("failed");
    }
});

提交表单.php

<?php
if($query == 'successful'){
    $return['success'] = true;
    $return['message'] = 'Success!';
}
else{
    $return['success'] = false;
    $return['message'] = 'Failed!';
}
echo json_encode($return);
?>

还有另一种方法可以做到这一点。

if($("#form1").validate())
{


$.ajax({
                url: "submitForm.php",
                type: "post",
                data: $(form).serialize(),
                success: function(){
                    alert("successful");
                },
                error: function(jq,status,message){
                    alert("failed");
                }
            });
            return false;
 }

此代码:

success: function(){
    alert("successful");
},

AJAX 调用成功时执行,而不是在登录成功时执行。您需要将登录结果响应传递给您的 JavaScript,例如:

success: function(response){
    if ( response === 'successful' )
    {
        alert('success');
    }
    else
    {
        alert('failed to login');
    }
},

还要小心给出适当的回应。例如,响应将是一个完整的HTML页面(我们真的不想传递),所以在你的PHP中你可以做这样的事情:

if ( login_checking_function() )
{
    if ( empty($_SERVER['HTTP_X_REQUESTED_WITH']) &&
         strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest')
       )
    {
        echo 'successful';
    }
        else
        {
            // do something for non AJAX call, but successful login
        }
}

您检查$_SERVER['HTTP_X_REQUESTED_WITH']因为 jQuery 将此标头添加到 AJAX 调用中,这样您就知道该页面是通过 AJAX 请求的。