2015-05-28 162 views
-1

我正在處理郵件聯繫表單,並在我提交併刷新郵件後繼續收到我的電子郵件。我怎麼能解決這個問題?我的代碼如下。PHP聯繫表格提交

 <?php 

     if (isset($_POST['contact_name']) && isset($_POST['contact_email']) && isset($_POST['contact_text'])) { 
      $contact_name = $_POST['contact_name']; 
      $contact_email = $_POST['contact_email']; 
      $contact_text = $_POST['contact_text']; 

      if (!empty($contact_name) && !empty($contact_email) && !empty($contact_text)) { 

       $to = '[email protected]'; 
       $subject = 'Contact form'; 
       $body = $contact_name."\n".$contact_text; 
       $headers = 'From: '.$contact_email; 

       if (mail($to, $subject, $body, $headers)) { 
       Echo 'Thanks for contacting me. I will be in touch soon.'; 
       } else { 
       echo 'Sorry, an error occurred. Please try again later.'; 
       } 

      } else { 
       echo 'All fields are required'; 
      } 
     } 

     ?> 
+0

會話和令牌和重定向和重新驗證形式。無法擊敗那個組合。 –

回答

1

你應該處理形式&發送電子郵件後用戶重定向到另一個頁面。

要重定向,您可以使用:

header("Location:thanks.php"); 
exit(); 

您的代碼應改爲:

if (mail($to, $subject, $body, $headers)) { 
     header("Location:thanks.php"); //<-- Note change here 
     exit(); 
    } else { 
     echo 'Sorry, an error occurred. Please try again later.'; 
    } 
+0

我的代碼在哪裏必須添加? – drizzyme

3

如果你想阻止的情況,其中用戶通過刷新你的頁面重新提交表單,一個不錯的選擇是重定向用戶到完全相同的頁面。這種方式在瀏覽器歷史記錄中的最後一個請求從POST更改爲GET,刷新後只需重新加載頁面而不用重新提交表單。

這可以用下面的代碼來實現:

 header("HTTP/1.1 302 Moved Temporarily");   
     header("Location: the-url-of-the-page.php", true, 302); 
     header("Connection: close"); 
     exit(); 

請確保代碼處理表單(發送電子郵件)之後,但任何數據發送到瀏覽器之前執行。

+0

什麼是標題的默認重定向代碼?我猜這是默認的302。 –

+0

是的,默認情況下是302,但是1)我從不信任PHP從版本更改爲版本2)我每次看到代碼都清楚地看到它,並且不需要查閱文檔以便記住。 –

1

或者,當你發出的郵件,並感謝用戶如果分支,可以取消設置POST變量如下,

unset($_POST['contact_name']);