Ajax-форма не работает (jQuery — PHP)

#php #jquery #ajax #post

#php #jquery #ajax #Публикация

Вопрос:

jQuery:

 $("#contact-us-form").submit(function () {
    var nameVal = $("input[name=name]").val();
    var companyVal = $("input[name=company]").val();
    var titleVal = $("input[name=title]").val();
    var emailVal = $("input[name=email]").val();
    var phoneVal = $("input[name=phone]").val();
    var messageVal = $("input[name=message]").val();
    $.post("mailer.php", {
        name: nameVal,
        company: companyVal,
        title: titleVal,
        email: emailVal,
        phone: phoneVal,
        message: messageVal
    }, function (data) {
        alert("Data Loaded: "   data);
        $('#thanks').show();
    });
    return false;
});
  

mailer.php:

 <?php

if(isset($_POST['submit'])) {

    $to = "admin@domain.com";
    $subject = "Inquiry";
    $name = $_POST['name'];
    $company = $_POST['company'];
    $title = $_POST['title'];
    $email = $_POST['email'];
    $phone = $_POST['phone'];
    $message = $_POST['message'];

    $body = <<<HEREDOC
        From: $name
        Company: $company
        Title: $title 
        E-Mail: $email
        Phone: $phone n
        Message: $message 
HEREDOC;

    echo 'success';
    mail($to, $subject, $body);

} else {
    echo "failure";
}

?>
  

Возвращается предупреждение о данных на странице failure , я не понимаю почему!

Спасибо за вашу помощь!

Ответ №1:

Две вещи, во-первых, основная проблема заключается в том, что вы не передаете submit переменную (если есть кнопка отправки, она не сериализуется, как в обычном сообщении), поэтому вам нужно добавить ее. Кроме того, вы действительно можете сократить свой код, используя .serialize() для сериализации <form> вот так:

 $("#contact-us-form").submit(function () {
  $.post("mailer.php", $(this).serialize(), function (data) {
    alert("Data Loaded: "   data);
    $('#thanks').show();
  });
  return false;
});
  

Чтобы добавить туда свою submit переменную, просто используйте .serializeArray() и добавьте ее, сделайте это:

 $("#contact-us-form").submit(function () {
  var fdata = $(this).serializeArray();
  fdata.push({ name: 'submit', value: true });
  $.post("mailer.php", fdata, function (data) {
    alert("Data Loaded: "   data);
    $('#thanks').show();
  });
  return false;
});
  

Комментарии:

1. … и что бы mailer.php как выглядит? Как отменить сериализацию входных данных?

2. @Nimbuz — Это не потребовало бы никаких изменений на стороне PHP 🙂 .serialize() это просто очень быстрый способ сделать то, что вы уже делаете, он берет элементы формы и сериализует их в name=valueamp;name2=value2 и т.д…. как вы уже делаете, и как работает обычный <form> POST без JavaScript вообще.

3. Вау!! Работает просто великолепно! Огромное спасибо, Ник.

Ответ №2:

Мне кажется, что вы не отправляете значение для «submit» в mailer.php значит, ваше условие не выполняется.

Ответ №3:

Просматривая данные, которые вы передаете в свой mail.php через JS вы не передали «отправить», на котором вы основываете свое условие.

Я бы посоветовал вам передать что-то вроде:

     $.post("mailer.php", { 
            name: nameVal, 
            company: companyVal, 
            title: titleVal, 
            email: emailVal, 
            phone: phoneVal, 
            message: messageVal,
action: "send-email"
        }, function (data) { 
            alert("Data Loaded: "   data); 
            $('#thanks').show(); 
        });
  

и в вашем PHP измените условие на:

 if($_POST['action'] == "send-email") {   
  

Комментарии:

1. Используйте Firebug через Firefox, чтобы отслеживать, какие данные были отправлены за кулисами. Это даст вам представление о том, что происходит.