使用AJAX的PHP邮件不会从服务器返回验证错误

时间:2016-03-11 01:20:06

标签: php jquery ajax validation email

我正在尝试发送一封包含PHP和AJAX的电子邮件,它最终有效,但它不会显示从服务器返回的验证错误。我想我在迭代这些数据时做错了什么,或者只是不了解将PHP和jQuery与JSON连接起来的事情。

服务器上的PHP邮件脚本:

$to = "mymail@gmail.com";

if (isset($_POST['name'], $_POST['mail'], $_POST['text'])) {
    if (empty($_POST['name'])) {
        $errors[] = "Molimo unesite Vaše ime";
    } else {
        $contact_name = htmlentities($_POST['name']);
    }
if (empty($_POST['mail'])) {
    $errors[] = "Molimo unesite Vašu email adresu.";
} else if (strlen($_POST['mail']) > 60) {
    $errors[] = "Vaša email adresa je predugačka.";
} else if (filter_var($_POST['mail'], FILTER_VALIDATE_EMAIL) === false ) {
    $errors[] = "Unesite validnu email adresu.";
} else {
    $contact_mail = "<" . htmlentities($_POST['mail']) . ">";
}

    if (empty($_POST['text'])) {
        $errors[] = "Molimo unesite poruku.";
    } else {
        $contact_text = htmlentities($_POST['text']);
    }
}

if (empty($errors) === true) {
    if(isset($contact_text, $contact_name, $contact_mail)) {
        $subject = "Mail from " . $contact_name ." via www.mysite.com";
        $headers = "From: " . $contact_mail;
        $sent = mail($to, $subject, $contact_text, $headers);
        if ($sent) {
            die("true");
        } else {
            return json_encode($errors);
        }
    }
}

相关的jQuery:

var mailBroker = {
    send : function() { //initial validation and sending to server
        var contact_name = $('input[name="contact-name"]').val();
        var contact_mail = $('input[name="contact-mail"]').val();
        var contact_text = $('textarea[name="contact-text"]').val();
        var status = ""; //send success status

        if (contact_name === "" || contact_mail === "" || contact_text === "") {
            //form not complete
        } else {
            $.post("includes/mail.php", { //post form data to server
                name : contact_name,
                mail : contact_mail,
                text : contact_text
            }, function(data) {
                var response = data;
                if (data === "true") { //succesful
                    mailBroker.setStatus('Poruka poslata.');
                } else {
                    var parsedData = $.parseJSON(data);
                    $.each(parsedData, function() {
                        var that = $(this);
                        setStatus(that);
                    });
                }
            });
        }
    },
    setStatus : function(status) {
        $('textarea[name="contact-text"]').after('<span>' + status + '</span>');
    }
}

$(document).ready()内:

$('#contact-us form').submit(function(event) {
    event.preventDefault();
    mailBroker.send();
    $(this).trigger('reset');
});

有人可以指出我做错了吗?

当然,我知道我可以在客户端进行,但这是不好的做法。所以我暂时离开了这一部分,并假设无效或没有数据通过所需的表单字段。

3 个答案:

答案 0 :(得分:1)

答案表格更容易解释。代码中的逻辑永远不会让您的脚本有机会将错误输出到AJAX。你需要改变它的逻辑。即

if (empty($errors) === true) {
    if(isset($contact_text, $contact_name, $contact_mail)) {
        $subject = "Mail from " . $contact_name ." via www.mysite.com";
        $headers = "From: " . $contact_mail;
        $sent = mail($to, $subject, $contact_text, $headers);
        if ($sent) {
            die("true");
        } else {
            die("false"); // with json_encode here, $errors will always be empty
        }
    }
} else {
    die(json_encode($errors)); //$errors wasn't empty, this is where you need to hand it back to the JS.
}

这就是firebug或其他工具可以提供帮助的原因。您可以看到您想要提供给JS的信息不存在 - 这就是您知道查看PHP(服务器端)的方式,因为它不会按预期输出。如果是,您可以检查JS代码,看看为什么没有按预期处理它。

编辑:当一个字段为空时,你的javascript不允许PHP执行,但是如果一个是空的,你想要PHP给出的反馈,所以你想要把你的JS改成什么像:

var mailBroker = {
    send : function() { //initial validation and sending to server
    var contact_name = $('input[name="contact-name"]').val();
    var contact_mail = $('input[name="contact-mail"]').val();
    var contact_text = $('textarea[name="contact-text"]').val();
    var status = ""; //send success status

    $.post("includes/mail.php", { //post form data to server
    name : contact_name,
    mail : contact_mail,
    text : contact_text
    }, function(data) {
    var response = data;
    if (data === "true") { //succesful
        mailBroker.setStatus('Poruka poslata.');
    } else {
        var parsedData = $.parseJSON(data);
        $.each(parsedData, function() {
        var that = $(this);
        setStatus(that);
        });
    }
    });
    },
    setStatus : function(status) {
    $('textarea[name="contact-text"]').after('<span>' + status + '</span>');
    }
}

答案 1 :(得分:0)

对Jon的回答进行了一些修改,因为您仍然需要从返回的JSON中提取消息:

var mailBroker = {
    'send' : function() { //initial validation and sending to server
        var contact_name = $('input[name="contact-name"]').val();
        var contact_mail = $('input[name="contact-mail"]').val();
        var contact_text = $('textarea[name="contact-text"]').val();
        var status = ""; //send success status

        $.post("includes/mail.php", { //post form data to server
            name : contact_name,
            mail : contact_mail,
            text : contact_text
        }, function(data) {
            var response = data;
            if (data === "true") { //succesful
                mailBroker.setStatus('Poruka poslata.');
                $('#contact-us form').trigger('reset');
            } else { //validation failed
                var parsedData = $.parseJSON(data);
                var msg = '';
                $.each(parsedData, function() {
                    var that = $(this);
                    for (var i = 0; i < that.size(); i++) {
                        msg += that[i];
                    }
                    mailBroker.setStatus(msg); //msg used to be 'that'
                    msg = '';
                });
            }
        });

    },

    'setStatus' : function(status) {
        $('#validation-msgs').prepend('<p class="validation-msg">' + status + '</p>');
    }
}

基本上 - 您需要通过解析的数据来获取每条消息。问题是它们也存储为数组 - 字符。因此,您也需要通过这些,并将这些字符附加到消息String。

然后,您应该将这些消息添加到某个容器中以获取警告,以便它们按正确的顺序排列。如果你不这样做,你将获得[对象]而不是消息文本。

希望这会有所帮助。

答案 2 :(得分:-1)

嗨,我觉得你搞砸了你的第3行邮件脚本。 if (isset($_POST['name'], $_POST['mail'], $_POST['text'])) { 因为你会使用comparison operators

如下所示。

if (isset($_POST['name'] && $_POST['mail'] && $_POST['text'])) {