2013-10-08 2 views
3

У меня есть эта проблема с моей контактной формой. Когда я отправляю форму, я получаю 2 одинаковых письма в своей коробке.PHP mail() отправляет 2 копии

Я использую JS для проверки формы на наличие ошибок, а затем простой функции PHP mail() для отправки электронной почты.

Вот PHP код:

<?php 

$from = Trim(stripslashes($_POST['email'])); 
$to = "[email protected]"; 

$subject = "Contact Form"; 
$name = Trim(stripslashes($_POST['name'])); 
$email = Trim(stripslashes($_POST['email'])); 
$number = Trim(stripslashes($_POST['number'])); 
$message = Trim(stripslashes($_POST['message'])); 

    $body = ""; 
    $body .= "Name: "; 
    $body .= $name; 
    $body .= "\n\n"; 
    $body .= "E-mail: "; 
    $body .= $email; 
    $body .= "\n\n"; 
    $body .= "Telephone Number: "; 
    $body .= $number; 
    $body .= "\n\n"; 
    $body .= "Message: "; 
    $body .= $message; 
    $body .= "\n\n"; 

    $success = mail($to, $subject, $body, "From: <$from>" . "\r\n" . "Reply-to: <$from>" . "\r\n" . "Content-type: text; charset=utf-8"); 

?> 

А вот JS:

$(".submit").click(function() { 
     var name = $("input[name=name]").val(); 
     var email = $("input[name=email]").val(); 
     var number = $("input[name=number]").val(); 
     var message = $("textarea[name=message]").val(); 

     if (defaults['name'] == name || name == "") { 
      $(".error").text("Please enter your name!"); 
      return false; 

     } else if (defaults['email'] == email || email == "") { 
      $(".error").text("Please enter your email!"); 
      return false; 

     } else if (defaults['number'] == number || number == "") { 
      $(".error").text("Please enter your number!"); 
      return false; 

     } else if (defaults['message'] == message || message == "") { 
      $(".error").text("Plese enter your message!"); 
      return false; 
     } 

     var dataString = 'name=' + name + '&email=' + email + '&number=' + number + '&message=' + message; 
     $(".error").text("Please wait...").hide().fadeIn("fast"); 

     $.ajax({ 
      type: "POST", 
      url: "contact.php", 
      data: dataString, 
      success: function() { 
       $('#form form').html(""); 
       $('#form form').append("<div id='success'>Your message has been sent! Thank you</div>"); 
      } 
     }); 

     return false; 
    }); 

А вот HTML форма:

<form id="contact" method="post" action="#"> 

<label for="name">Name:</label> 
<input type="text" name="name" required tabindex="1"> 

<label for="email">Email adress:</label> 
<input type="text" name="email" required tabindex="2"> 

<label for="number">Tel. number:</label> 
<input type="text" name="number" tabindex="3"> 

<label for="message">Your message:</label> 
<textarea name="message" rows="10" cols="70" required tabindex="4"></textarea> 

<input type="checkbox" id="terms" name="terms" value="terms">I agree to the <a href="#">terms</a> 

<input type="submit" name="submit" class="submit more-info" tabindex="5" value="Send"> 

<span class="error"></span> 

</form> 

Я использовал тот же код для всех моих контактных форм, и все сработало. Может ли это быть проблема с хостингом/сервером?

+6

Вы проверили это в Firebug и т. д.? Отправляется ли запрос POST один или два раза? – Adam

+2

в коде нет ничего плохого .. сделайте это в коде для цели тестирования '$ body. =" \ N \ n "; $ body. = rand (1000000,9999999); 'и проверить, совпадают ли номера в обоих письмах или diff? – zzlalani

+0

Попробуйте записать каждый запрос в файл журнала 'file_put_contents ('log.txt', date ('h: i'). '\ N', FILE_APPEND);' и затем проверить, есть ли два одинаковых раза –

ответ

2

заменить свое событие CLICK

$(".submit").click(function() { 

с

$('.submit').unbind('click').click(function() { 

кода.

Что я могу предположить, ваше событие щелчка является обязательным в два раза, может быть связано с большим количеством беспорядка в коде

также использовать эту строку в конце функции событий нажмите

$('.submit').unbind('click').click(function() { 

    // your stuff 

    event.stopImmediatePropagation(); // as long as not bubbling up the DOM is ok? 
}); 

для справки смотрите ссылку: https://forum.jquery.com/topic/jquery-executes-twice-after-ajax

+1

Итак, в конце это будет выглядеть так: '$ ('. Submit'). Unbind ('click'). Click (function (event) {и затем в конце: event.preventDefault(); \t событие. stopImmediatePropagation(); –

+0

Да, вы выбираете его правильно – zzlalani

2

$(".submit").click(function(e) { ... }) POSTS на ваш сервер в первый раз.

Потому что это кнопка <submit>, форма все равно будет отправлена. Форма POSTS на ваш сервер во второй раз.

Решение будет добавление e.preventDefault() на дне внутри функции $(".submit").click ...

$(".submit").click(function(e) { 
    //     ^add this e 
    var name = ...; 

    $.ajax({ 
     ... 
    }); 
    e.preventDefault(); 
    return false; 
}); 
+0

Это уже было предложено, но это не исправляет проблему. Есть еще 2 запроса POST и 2 письма. –

+0

Форма имеет 'action =" # "', поэтому я серьезно сомневаюсь, что это может вызвать ее. – Izkata

+0

О, хм. Я буду возиться и посмотреть, действительно ли требуется «return false». – Brian

0

Попробуйте удалить анимацию JQuery:

$(".error").text("Please wait...").hide().fadeIn("fast"); 

Они могут иногда вызывать проблемы.

+0

Никакой разницы. –

Смежные вопросы