2016-11-08 48 views
0

我是PHP的新手,並試圖學習如何設置一個選項,人們可以通過點擊提交按鈕發送一個emai。但我已經檢查了所有代碼幾次,但無法弄清楚我做錯了什麼。AJAX找不到PHP文件。它返回「POST 405(方法不允許)」

控制檯說:

ajax.js:24 POST http://localhost:8081/send_email.php 405 (Method Not Allowed)

拒絕訪問的語法:ajax.open( 「POST」, 「send_email.php」);;`

Files文件夾結構:

send_email.php 
index.html 
JS 
-ajax.js // 

我怎麼能得到這個小小的東西運行。需要你們的幫助才能使這件事情順利進行,你看到我幾乎在那裏。

function _(id) { 
    return document.getElementById(id); 
} 

function submitForm() { 
    _("button").disbaled = true; 
    _("status").innerHTML = "Please wait..."; 
    var formdata = new FormData(); 
    formdata.append("email", _("email").value); 
    formdata.append("subject", _("subject").value); 
    formdata.append("message", _("message").value); 
    var ajax = new XMLHttpRequest(); 
    ajax.open("POST", "send_email.php"); // parameter: method, url, boolean (optional) 
    ajax.onreadystatechange = function() { 
     if(ajax.readyState == 4 && ajax.status == 200) { 
      if(ajax.responseText == "success") { 
       _("contact-form").innerHTML = "<h2>Thanks, your email is sent successfully</h2>!"; 
      } else { 
       _("status").innerHTML = ajax.responseText; 
       _("mybtn").disabled = false; 
      } 
     } 
    } 
    ajax.send(formdata); 
} 

服務器端代碼:

<?php 
    if (isset($_POST["email"]) && isset($_POST["subject"]) && isset($_POST["message"])) { 
     $email = $_POST["email"]; 
     $subject = $_POST["subject"]; 
     $message = nl2br($_POST["message"]); 
     $to = "[email protected]"; 
     $from = $email; 
     $subject = "Contact From Message"; 
     $message = "<b>Email Address:</b> ".$email. " <br><b>Subject: </b> ".$subject." <br><p> ".$message." </p>"; 
     $headers = "From: $from\n"; 
     $headers = "MIME-version: 1.0\n"; 
     $headers = "Content-type: text/html; charset=iso-8859-1\n"; 
     if (mail($to, $subject, $message, $headers)) { 
      echo "success"; 
     } else { 
      echo "The server failed to send the message. Please try again later."; 
     } 
    } 
?> 
<body> 
    <form id="contact-form" onsubmit="submitForm(); return false;"> 
    <label> 
     <span class="contact">Your Email</span> 
     <input id="email" class="contact_input" type="text" name="email" placeholder="[email protected]"> 
    </label> 

    <label> 
     <span class="contact">Subject</span> 
     <input id="subject" class="contact_input contactinfo" type="text" name="message"> 
    </label> 

    <label> 
     <span class="contact">Message</span> 
     <textarea id="message" class="contact_input contactinfo" type="text"></textarea> 
    </label> 

    <label> 
     <input id="button" type="submit" value="SEND"> 
     <span id="status"></span> 
    </label> 
    </form> 
</body> 
+0

在您的控制檯中您的請求使用什麼方法? (網絡標籤) –

+0

你是什麼意思哪種方法 –

+0

'post'或'get' –

回答

1

如果您正在運行兩臺服務器,它們可能不在同一端口上運行......您必須更改AJAX網址以放置正確的端口。

現在你要求localhost:8081/send_email.php,這是不可以通過你的節點服務器(和PHP代碼當然不會得到評估)。

更改爲URL並在正確的端口上包含您的Apache服務器上的頁面完整URL。

+0

已將其更改爲ajax.open(「POST」,「localhost:80/send_email.php」); //參數:method,url,boolean(可選),但得到另一個錯誤:MLHttpRequest無法加載localhost:80/send_email.php。協議方案僅支持交叉源請求:http,data,chrome,chrome-extension,https,chrome-extension-resource。 –

+0

是的,這是使用兩臺服務器的一個問題。兩個解決方案:1.使你的Apache服務器交付HTML和JS,或者你的Node服務器做你的數據處理(推薦安全)2.參見[這篇文章](http://stackoverflow.com/questions/13388942/allow- cross-domain-ajax-requests)(如果你是唯一一個使用你的應用的話) – nicovank

0

您正在試圖simultaeneously調試多個組件 - 這是從來沒有成功的祕訣。該錯誤消息似乎是作爲HTTP狀態從服務器返回的(您是否檢查日誌以驗證?),並且它似乎未在您的PHP代碼中觸發。我建議您應該嘗試的第一件事是:

<pre> 
<?php 
print_r($_POST); 
?> 
</pre> 
<form method='POST'> 
<input type='text' name='sometext' value='hello world'> 
<input type='submit' name='submit' value='submit'> 
</form> 

並查看您是否得到相同的錯誤。我懷疑這會是這種情況,這意味着它是您的服務器配置,Web應用程序防火牆配置或您未告訴我們的PHP自動預裝(或其他PHP代碼)的問題。

+0

我試過了代碼,點擊提交按鈕後它會將我發送到空白頁面。 –

+0

你知道代碼在做什麼嗎?你有沒有檢查你的日誌?您是否將日誌與使用AJAX的嘗試進行比較? – symcbean

+0

最初,問題出在了錯誤的網址上。應該是http:// localhost:80/php/send_email.php,因爲我將該文件放在XAMPP的htdocs文件夾中並將其命名爲php。現在它讀取我認爲的PHP文件,但現在有不幸的另一個問題: 警告:郵件():無法連接到郵件服務器在「本地主機」端口25,驗證您的「SMTP」和「smtp_port」設置在PHP中。 ini或在第17行的C:\ xampp \ htdocs \ php \ send_email.php中使用ini_set() 服務器未能發送消息。請稍後再試。 –