You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP新手求助:网站表单提交失败,无返回错误信息

表单提交失败排查与修复

问题现象

点击表单「Send Message」按钮时,出现错误提示:Error: Form submission failed and no error message returned from: contact.php

相关代码

HTML表单

<form id="contact-form" action="contact.php" method="post" data-toggle="validator" role="form" class="php-email-form">
  <div class="row">
    <div class="col-md-6 form-group">
      <input type="text" name="name" class="form-control" id="name" placeholder="Your Name" required>
    </div>
    <div class="col-md-6 form-group mt-3 mt-md-0">
      <input type="email" class="form-control" name="email" id="email" placeholder="Your Email" required>
    </div>
  </div>
  <div class="form-group mt-3">
    <input type="text" class="form-control" name="subject" id="subject" placeholder="Subject" required>
  </div>
  <div class="form-group mt-3">
    <textarea class="form-control" name="message" rows="5" placeholder="Message" required></textarea>
  </div>
  <div class="my-3">
    <div class="loading">Loading</div>
    <div class="error-message"></div>
    <div class="sent-message">Your message has been sent. Thank you!</div>
  </div>
  
  <div class="text-center">
    <button id="submit" type="submit">Send Message</button>
  </div>
</form>

contact.php

<?php
  $receiving_email_address = 'myemail@blabla.com';

  $to = 'myemail@blabla.com';
  $name = filter_input(INPUT_POST, 'name', FILTER_SANITIZE_SPECIAL_CHARS);
  $from = filter_input(INPUT_POST, 'email', FILTER_SANITIZE_EMAIL);
  $subject = filter_input(INPUT_POST, 'subject', FILTER_SANITIZE_SPECIAL_CHARS);
  $message = filter_input(INPUT_POST, 'message', FILTER_SANITIZE_SPECIAL_CHARS);

  if (filter_var($from, FILTER_VALIDATE_EMAIL)) {
    $headers = ['From' => ($name?"<$name> ":'').$from,
            'X-Mailer' => 'PHP/' . phpversion()
           ];

    mail($to, $subject, $message."

from: ".$_SERVER['REMOTE_ADDR'], $headers);
    die('OK');
    
} else {
    die('Invalid address');
}

  echo $contact->send();
?>

contact.js

(function () {
  "use strict";

  let forms = document.querySelectorAll('.php-email-form');

  forms.forEach( function(e) {
    e.addEventListener('submit', function(event) {
      event.preventDefault();

      let thisForm = this;

      let action = thisForm.getAttribute('action');
      let recaptcha = thisForm.getAttribute('data-recaptcha-site-key');
      
      if( ! action ) {
        displayError(thisForm, 'The form action property is not set!')
        return;
      }
      thisForm.querySelector('.loading').classList.add('d-block');
      thisForm.querySelector('.error-message').classList.remove('d-block');
      thisForm.querySelector('.sent-message').classList.remove('d-block');

      let formData = new FormData( thisForm );

      if ( recaptcha ) {
        if(typeof grecaptcha !== "undefined" ) {
          grecaptcha.ready(function() {
            try {
              grecaptcha.execute(recaptcha, {action: 'php_email_form_submit'})
              .then(token => {
                formData.set('recaptcha-response', token);
                php_email_form_submit(thisForm, action, formData);
              })
            } catch(error) {
              displayError(thisForm, error)
            }
          });
        } else {
          displayError(thisForm, 'The reCaptcha javascript API url is not loaded!')
        }
      } else {
        php_email_form_submit(thisForm, action, formData);
      }
    });
  });

  function php_email_form_submit(thisForm, action, formData) {
    fetch(action, {
      method: 'POST',
      body: formData,
      headers: {'X-Requested-With': 'XMLHttpRequest'}
    })
    .then(response => {
      return response.text();
    })
    .then(data => {
      thisForm.querySelector('.loading').classList.remove('d-block');
      if (data.trim() == 'OK') {
        thisForm.querySelector('.sent-message').classList.add('d-block');
        thisForm.reset(); 
      } else {
        throw new Error(data ? data : 'Form submission failed and no error message returned from: ' + action); 
      }
    })
    .catch((error) => {
      displayError(thisForm, error);
    });
  }

  function displayError(thisForm, error) {
    thisForm.querySelector('.loading').classList.remove('d-block');
    thisForm.querySelector('.error-message').innerHTML = error;
    thisForm.querySelector('.error-message').classList.add('d-block');
  }

})();

问题排查与修复方案

1. 修复PHP代码冗余与逻辑漏洞

  • 移除无效代码:contact.php末尾的echo $contact->send();永远不会被执行,直接删除即可。
  • 增加输入合法性检查:前端required验证可被绕过,需在后端补充字段非空判断:
    if(empty($name) || empty($from) || empty($subject) || empty($message)) {
        die('All fields are required');
    }
    
  • 限制请求方法:确保仅处理POST请求,避免直接访问contact.php返回错误:
    if($_SERVER['REQUEST_METHOD'] !== 'POST') {
        die('Invalid request method');
    }
    

2. 排查邮件发送功能

很多服务器默认禁用或未配置mail()函数,可先测试该函数是否有效:

// 在contact.php开头添加测试代码
$testResult = mail('your-test-email@example.com', 'Test Mail', 'This is a test message');
var_dump($testResult); // 输出false说明mail函数无法使用

若mail()失效,建议改用PHPMailer等第三方邮件库,或联系服务器管理员配置SMTP服务。

3. 优化JavaScript错误捕获

当前JS未处理服务器返回的500等错误状态,修改fetch响应逻辑:

.then(response => {
  if (!response.ok) {
    throw new Error(`Server error: ${response.status}`);
  }
  return response.text();
})

4. 服务器环境检查

  • 确认服务器支持PHP 5.6及以上版本;
  • 检查contact.php文件权限设置为644;
  • 查看服务器错误日志(如Apache的error.log、Nginx的error.log),获取更详细的错误信息。

内容的提问来源于stack exchange,提问作者Sain Ahab

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 05:15:37