0

我已经使用 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;
        }
    });
4

3 回答 3

4

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

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

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

下面是一个快速的 n'dirty 演示

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);
?>
于 2013-09-19T14:57:53.080 回答
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 请求的。

于 2013-09-19T14:52:31.660 回答
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;

 }
于 2013-09-19T14:45:38.527 回答