jquery ajax提交在验证后总是返回成功

时间:2013-09-19 14:39:17

标签: php ajax jquery-validate

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

以下是相关代码:

$("#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;
        }
    });

3 个答案:

答案 0 :(得分:4)

您仍然获得“成功”的原因是因为PHP发送200响应以便浏览器显示PHP错误并且success:处理程序检查200响应

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

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

下面是一个快速的脏演示

<强> 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");
    }
});

<强> submitForm.php

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

echo json_encode($return);
?>

答案 1 :(得分:2)

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

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;

 }

答案 2 :(得分:2)

此代码:

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提供的。