【问题标题】:Contact Form Stuck in Validation联系表格卡在验证中
【发布时间】:2024-04-24 10:20:02
【问题描述】:

我正在尝试为投资组合网站建立并运行联系表。我了解设计,但对开发/服务器端问题的了解非常有限。

表单按预期运行,但提交时表单返回“..sending”,事情就停在那里。我没有收到电子邮件,状态也没有进展。

我的网站托管在 Hostinger 上,它不使用 Apache(我对此一无所知)。但是,根据我的阅读,我确实需要某种类型的 php 服务器,例如 apache 才能使这个表单起作用。主持人说他们确实支持 Ajax,并且电子邮件没有被阻止。

我正在尝试使用 Ajax、验证脚本和 php 来允许在不离开当前页面的情况下提交表单,如下所示:(这是一个 MDB 表单)。这是托管站点的链接以供参考:https://intakt-design.com

我在开发工具中收到此错误:未捕获的引用错误:sendMessage() 未在验证表单中定义

我觉得这就是问题所在,但我不知道这里发生了什么,谷歌正在引导我转圈......

代码 sn-p 链接:https://mdbootstrap.com/snippets/jquery/marcin-luczak/2705367

请原谅我的无知,总的来说,我是网页设计的新手(平面设计专业的学生),后端开发超出了我的想象。

PHP:

<?php
$name = $_POST['name'];
$email = $_POST['email'];
$message = $_POST['message'];
$subject = $_POST['subject'];
header('Content-Type: application/json');
if ($name === ''){
print json_encode(array('message' => 'Name cannot be empty', 'code' => 0));
exit();
}
if ($email === ''){
print json_encode(array('message' => 'Email cannot be empty', 'code' => 0));
exit();
} else {
if (!filter_var($email, FILTER_VALIDATE_EMAIL)){
print json_encode(array('message' => 'Email format invalid.', 'code' => 0));
exit();
}
}
if ($subject === ''){
print json_encode(array('message' => 'Subject cannot be empty', 'code' => 0));
exit();
}
if ($message === ''){
print json_encode(array('message' => 'Message cannot be empty', 'code' => 0));
exit();
}
$content="From: $name \nEmail: $email \nMessage: $message";
$recipient = "story@intakt-design.com";
$mailheader = "From: $email \r\n";
mail($recipient, $subject, $content, $mailheader) or die("Error!");
print json_encode(array('message' => 'Email Delivered! Thanks for contacting inTakt Design!', 'code' => 1));
exit();
?>

HTML:

 <!-- Contact Form -->
      <div class="contact-content py-5">
        <section class="mb-4 col-11 col-sm-10 col-lg-8 mx-auto mt-0 mb-3 form">

            <!--Section heading-->
            <h2 class="h1-responsive font-weight-bold text-center p-3 my-4 form-text form-head">Just Fill in the Blanks!</h2>
            <!--Section description-->
            <p class="text-center w-responsive mx-auto mb-5 form-text form-subhead">Do you have any questions or inquiries? Please do not hesitate to contact me directly.<br />I will typically respond within 24 hours.</p>

            <div class="row">

                <!--Grid column-->
                <div class="col-md-9 mb-md-0 mb-5">
                    <form id="contact-form" name="contact-form">

                        <!--Grid row-->
                        <div class="row">

                            <!--Grid column-->
                            <div class="col-md-6 form-field-containers">
                                <div class="md-form mb-0 form-field-containter">
                                    <input type="text" id="name" name="name" class="form-control">
                                    <label for="name" class="form-text form-field mt-n1">Your name</label>
                                </div>
                            </div>
                            <!--Grid column-->

                            <!--Grid column-->
                            <div class="col-md-6 form-field-containers">
                                <div class="md-form mb-0 form-field-container">
                                    <input type="text" id="email" name="email" class="form-control">
                                    <label for="email" class="form-text form-field mt-n1">Your email</label>
                                </div>
                            </div>
                            <!--Grid column-->

                        </div>
                        <!--Grid row-->

                        <!--Grid row-->
                        <div class="row">
                            <div class="col-md-12 mt-3 form-field-containers">
                                <div class="md-form mb-0 form-field-container">
                                    <input type="text" id="subject" name="subject" class="form-control">
                                    <label for="subject" class="form-text form-field mt-n1">Subject</label>
                                </div>
                            </div>
                        </div>
                        <!--Grid row-->

                        <!--Grid row-->
                        <div class="row">

                            <!--Grid column-->
                            <div class="col-md-12 mt-3">

                                <div class="md-form message-container">
                                    <textarea type="text" id="message" name="message" rows="2" class="form-control md-textarea p-2 message waves-effect"></textarea>
                                    <label for="message" class="form-text form-field mt-n1 message-label"><span class="message-canned-txt italic">Type Your Message Here</span></label>
                                </div>

                            </div>
                        </div>
                        <!--Grid row-->

                    </form>

                    <div class="text-center text-md-left">
                        <a class="btn btn-rounded waves-effect cta-btn-res col-12 col-lg-5 mt-3 mb-0" onclick="validateForm();">Submit</a>
                    </div>
                    <div class="status" id="status"></div>
                </div>
                <!--Grid column-->

                <!--Grid column-->
                <div class="col-md-3 text-center">
                    <ul class="list-unstyled mb-0">
                        <li><a href="#connect" class="fas fa-user-astronaut fa-2x form-icon phone waves-effect"></a><br />
                            <a href="#connect" class="form-text contact-info phone waves-effect">Connect with Me!</a>
                        </li>

                        <li><a href="tel:501-259-6907" class="fas fa-phone mt-4 fa-2x form-icon phone waves-effecte"></a><br />
                            <a href="tel:501-259-6907" class="form-text contact-info phone waves-effect">+ 501 259 6907</a>
                        </li>

                        <li><a href="mailto:story@intakt-design.com" class="fas fa-envelope mt-4 fa-2x form-icon email waves-effect"></a><br />
                            <a href="mailto:story@intakt-design.com" class="form-text contact-info email waves-effect">story@intakt-design.com</a>
                        </li>
                    </ul>
                </div>
                <!--Grid column-->
            </div>
        </section>
    <!--/ Contact Form-->

JS:

     <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>      
      <script type="text/javascript" src="js/jquery-3.5.1.js"></script>
      <script type="text/javascript" src="popper.js"></script>
      <script type="text/javascript" src="js/bootstrap.bundle.js"></script>
      <script type="text/javascript" src="js/mdb.js"></script>
      <script type="text/javascript" src="js/mdb.pro.js"></script>

<!--Custom scripts-->
<script>
  function validateForm() {
  var name =  document.getElementById('name').value;
  if (name == "") {
    document.querySelector('.status').innerHTML = "Name cannot be empty";
    return false;
  }
  var email =  document.getElementById('email').value;
  if (email == "") {
    document.querySelector('.status').innerHTML = "Email cannot be empty";
    return false;
  }        
  else {
    var re = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
    if(!re.test(email)){
      document.querySelector('.status').innerHTML = "Email format invalid";
      return false;
    }
  }
  var subject =  document.getElementById('subject').value;
  if (subject == "") {
    document.querySelector('.status').innerHTML = "Subject cannot be empty";
    return false;
  }
  var message =  document.getElementById('message').value;
  if (message == "") {
    document.querySelector('.status').innerHTML = "Message cannot be empty";
    return false;
  }

  document.querySelector('.status').innerHTML = "Sending...";

  sendMessage();
}

function sendMessge() {
  formData = {
    'name'     : $('input[name=name]').val(),
    'email'    : $('input[name=email]').val(),
    'subject'  : $('input[name=subject]').val(),
    'message'  : $('textarea[name=message]').val()
  };

  $.ajax({
    url : "mail.php",
    type: "POST",
    data : formData,
    success: function(data, textStatus, jqXHR)
    {

      $('#status').text(data.message);
      if (data.code) //If mail was sent successfully, reset the form.
        $('#contact-form').closest('form').find("input[type=text], textarea").val("");
    },
    error: function (jqXHR, textStatus, errorThrown)
    {
      $('#status').text(jqXHR);
    }
  });
}
    </script> 

【问题讨论】:

  • 之后您似乎永远不会清除/更改消息。你用的是.status#status,它们是一样的吗?
  • “但是,根据我的阅读,我确实需要某种类型的 php 服务器,例如 apache 才能使这个表单起作用。” - 这不一定需要在apache,但是是的,当然,如果你想在服务器端使用 PHP,那么你需要一个支持 PHP 的设置。你是否真的明白了,到目前为止我无法从你的描述中看出?
  • 我联系了 Hostinger... 这是他们的聊天回复:“我们不使用 Apache 并且您帐户上的电子邮件服务完全处于活动状态并正在运行,因此没有任何问题如果联系表单无法正常执行或工作,问题可能出在联系脚本本身的代码中, 执行应该不会有任何问题. 当前的 PHP 版本应该足够了 (目前, 你使用的是 7.2
  • 嘿Kerb,“状态”ID和Class实际上在同一个div上;此代码取自 MDB 员工支持提供的 sn-p。

标签: php ajax forms validation email


【解决方案1】:

我不知道为什么,但是由于一些不寻常的原因,sendMessage 无法正常工作。尝试重命名函数。 messageSending() 在你的 js 文件中并在你的 validateForm() 函数中调用它。

function validateForm() {
  var name =  document.getElementById('name').value;
  if (name == "") {
    document.querySelector('.status').innerHTML = "Name cannot be empty";
    return false;
  }
  var email =  document.getElementById('email').value;
  if (email == "") {
    document.querySelector('.status').innerHTML = "Email cannot be empty";
    return false;
  }        
  else {
    var re = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
    if(!re.test(email)){
      document.querySelector('.status').innerHTML = "Email format invalid";
      return false;
    }
  }
  var subject =  document.getElementById('subject').value;
  if (subject == "") {
    document.querySelector('.status').innerHTML = "Subject cannot be empty";
    return false;
  }
  var message =  document.getElementById('message').value;
  if (message == "") {
    document.querySelector('.status').innerHTML = "Message cannot be empty";
    return false;
  }

  document.querySelector('.status').innerHTML = "Sending...";

  messageSending();
}


function messageSending() {
  document.querySelector('.status').innerHTML = "123Sending...";
  formData = {
    'name'     : $('input[name=name]').val(),
    'email'    : $('input[name=email]').val(),
    'subject'  : $('input[name=subject]').val(),
    'message'  : $('textarea[name=message]').val()
  };

  $.ajax({
    url : "mail.php",
    type: "POST",
    data : formData,
    success: function(data, textStatus, jqXHR)
    {

      $('#status').text(data.message);
      if (data.code) //If mail was sent successfully, reset the form.
        $('#contact-form').closest('form').find("input[type=text], textarea").val("");
    },
    error: function (jqXHR, textStatus, errorThrown)
    {
      $('#status').text(jqXHR);
    }
  });
}

【讨论】:

  • 你是最棒的!我是一名平面设计专业的学生,​​我对开发工作感到头晕目眩……你拯救了这一天,一百万谢谢!
  • 谢谢。祝你好运