使用jquery.post()时$ _POST上的未定义索引

时间:2014-09-01 19:14:27

标签: php jquery post

这是我的PHP脚本:

<?php
    require_once 'PHPMailerAutoload.php';
    $mailApp = new PHPMailer();

    $name = $_POST['name'];
    $message = $_POST['message'];
    $email = $_POST['email'];

    $mailApp->From = $email;
    $mailApp->FromName = $name;
    $mailApp->Subject = 'Contacto de http://profile.cv.hsoto.me';
    $mailApp->Body = $message;
    $mailApp->AddAddress('hectorsoto@balamtech.com', 'Hector Soto');
    if($mailApp->Send()){
        echo '<div class="alert alert-success text-center">Su mensaje fue enviado. Gracias por ponerse en contacto conmigo.</div>';
    } else {
        echo '<div class="alert alert-danger text-center">El mensaje no se pudo enviar. Por favor intente de nuevo o mándelo al <a href="mailto:hectorsoto@balamtech.com">hacer click aquí</a>.</div>';
    }

?>

非常简单,它会发送一封电子邮件。

这是我的jquery脚本:

$('#cmdSendMessage').on('click', function(e){
        e.preventDefault();
        var message, name, email, error = "";
        email = $('#uemail').val();
        message = $('#umessage').val();
        name = $('#uname').val();
        if(email == "" || message == "" || name == ""){
            error = '<div class="alert alert-danger text-center">Uno o más campos están vacíos.</div>';
            $('#error-spot').append(error);
        }else if(!validateEmail(email)){
            error = '<div class="alert alert-danger text-center">El correo no es válido, su formato es incorrecto.</div>';
            $('#error-spot').append(error);
        } else{
            $.post('sendMail.php', 
                   {name : name, message : message, email : email}
                  ).done(
                        function(data){
                        $('#error-spot').append(data); 
                    }).fail(
                        function(data){
                        $('#error-spot').append('<div class="alert alert-danger text-center">Hubo un error y no se pudo mandar el correo. Hacerlo manualmente al <a href="mailto:hectorsoto@balamtech.com">hectorsoto@balamtech.com</a></div>');    
                    })
        }
    });

它会处理数据并发送电子邮件,但是它会导致错误:

enter image description here

为什么会发生这种情况的任何想法?

编辑:

在chrome上的网络标签上查看时,实际发送了它们:

enter image description here

这使得他们没有被另一方捕获更加奇怪。

3 个答案:

答案 0 :(得分:1)

isset用于$ _POST或$ _GET

示例:

$email = isset($_POST['email']) ? $_POST['email'] : NULL; // warning: Do sanitize

或您的脚本包含太多的POST和GET,然后添加以下行以便快速修复 -

ini_set('display_errors', 0);

注意:如果您的脚本包含任何其他错误,则它不会显示!

答案 1 :(得分:1)

首先要做的是添加三元运算符,或者在php结尾检查每个参数是否已经发送。 (务必清理传入的数据,尤其是在处理电子邮件时。)

$email = isset($_POST['email']) ? $_POST['email'] : "";
$message = isset($_POST['message']) ? $_POST['message'] : "";
$name = isset($_POST['name']) ? $_POST['name'] : "";

if ($email == "" || $message == "" || $name == "") die(); // something was not sent or direct request was attempted

您也可以在不更改当前代码的情况下执行此操作(但请清理它):

if (!isset($email) || !isset($message) || !isset($name)) die(); // something was not sent or direct request was attempted

如果您只是追加,则不需要错误变量 - 只需改为追加。

将变量命名为您通过发布消息发送的内容之外的其他内容也是一种很好的做法。这可能是您的问题 - post语句可能尝试使用与值相同的名称发送帖子数据,例如$_POST['test@test.com'] = 'test@test.com',因为您使用的名称与本地变量相同。更改您的本地变量名称(包括良好实践和潜在修复):

$('#cmdSendMessage').on('click', function(e){
    e.preventDefault();
    var uEmail, uMessage, uName, error = "";
    uEmail = $('#uemail').val();
    uMessage = $('#umessage').val();
    uName = $('#uname').val();
    if(uEmail == "" || uMessage == "" || uName == ""){
        $('#error-spot').append('<div class="alert alert-danger text-center">Uno o más campos están vacíos.</div>');

    }else if(!validateEmail(uEmail)){

        $('#error-spot').append('<div class="alert alert-danger text-center">El correo no es válido, su formato es incorrecto.</div>');

    } else{

        $.post('sendMail.php', {email : uEmail, message: uMessage, name: uName}
              ).done(
                    function(data){
                    $('#error-spot').append(data);
                }).fail(
                    function(data){
                    $('#error-spot').append('<div class="alert alert-danger text-center">Hubo un error y no se pudo mandar el correo. Hacerlo manualmente al <a href="mailto:hectorsoto@balamtech.com">hectorsoto@balamtech.com</a></div>');    
                })
    }
});

我也不确定为什么你要将数据附加到#error-spot(即使没有错误)。您应该更恰当地命名您的元素。

答案 2 :(得分:0)

这个问题的答案非常明显,但在我们编程生涯的任何特定时刻,我们大多数人都会遇到这个问题。

else{
            $.post('sendMail.php', 
                   {name : name, message : message, email : email}
                  ).done(
                        function(data){
                        $('#error-spot').append(data); 
                    }).fail(
                        function(data){
                        $('#error-spot').append('<div class="alert alert-danger text-center">Hubo un error y no se pudo mandar el correo. Hacerlo manualmente al <a href="mailto:hectorsoto@balamtech.com">hectorsoto@balamtech.com</a></div>');    
                    })
        }

$.post简写方法很容易就是一行代码,问题在于,为了便于阅读,程序员倾向于将它放在许多行中,因为原始帖子有它。

在链接方法之后,有些人经常忘记在最终回调函数的末尾添加分号。

在这种情况下,就在.fail()回调函数的末尾。