【问题标题】:php email form. Only want to post filled fields and not post empty onesphp 电子邮件表单。只想发布填充字段而不发布空字段
【发布时间】:2015-08-29 11:55:16
【问题描述】:

我有一个看起来像 this 的联系表

将根据用户在“我想”选择框上选择的内容显示不同的表单字段。

我想实现我在这个网站上找到的solution。基本上php只发布填写的字段,不发布空的字段。它使用以下代码来实现它

foreach ($_POST as $Field=>$Value) { 
if($Value != ''){
$body .= "$Field: $Value\n";
}
}

我不精通 PHP,无法应用提出的解决方案。如果有人可以帮助将解决方案实施到我的代码中以使其发布包括文本字段、选择框和单选组的非空表单元素,将不胜感激。

我的 PHP 表单处理器的代码如下所示

<?php

$name = $_POST['name'];  
$email_address = $_POST['email'];  
$phone = $_POST['phone'];  
$message = $_POST['message'];  
$p_prefered_day = $_POST['p_prefered_day'];  (radio button)
$session_time = $_POST['session_time'];  (select box)
$p_message = $_POST['p_message'];  
$treatment = $_POST['treatment'];  (select box)
$therapist = $_POST['therapist'];  (select box)
$b_pref_day = $_POST['b_pref_day'];  (radio button)
$b_pref_time = $_POST['b_pref_time'];  (radio button)
$b_message = $_POST['b_message'];  

$to = 'info@zenwebcreative.com.au'; 
$email_subject = "Website Contact Form:  $name";
$email_body = "You have received a new message from your website contact form.\n\n"."Here are the details:\n\nName: $name\n\nCompany: $company\n\nEmail: $email_address\n\nPhone: $phone\n\nMessage:\n$message";
$headers = "From: noreply@yourdomain.com\n";
$headers .= "Reply-To: $email_address"; 

mail($to,$email_subject,$email_body,$headers);
return true;            
?>

我的表单的 HTML 代码如下所示

  <form name="sentMessage" id="contactForm" novalidate>                
    <div class="form-group">
      <label>Full Name *</label>
      <input type="text" class="form-control" id="name" required>
    <p class="help-block text-danger"></p>
    </div><!--  end form-group -->

    <div class="form-group">
      <label>Email Address*</label>
      <input type="email" class="form-control" id="email" required>
    <p class="help-block text-danger"></p>
    </div><!--  end form-group -->

    <div class="form-group">
      <label>Contact Number</label>
      <input type="text" class="form-control" id="phone">
    </div> <!-- end form group -->

    <div class="form-group">
    <label>I would like to *</label>
      <select id="select_question" class="form-control">            
        <option selected="selected">Please select</option>
        <option value="question">Ask a question</option>
        <option value="pilates">Attend a pilates class</option>
        <option value="booking">Schedule a booking</option>
      </select>
    </div><!--  end form-group --> 

    <div class="form-group box question">
    <label>Message</label>
      <div class="input-group">                  
        <textarea id="message" class="form-control" rows="7" required></textarea>
        <span class="input-group-addon"><span class="glyphicon glyphicon-asterisk"></span></span>
      </div><!--  end input group -->
    <p class="help-block text-danger"></p>
    </div><!--  end form-group --> 

    <div class="box pilates">

      <div class="form-group">
        <label>Prefered day of the week *</label><br>
        <label class="radio-inline">
          <input type="radio" name="p_prefered_day" id="Tue" value="Tuesday">Tuesday
        </label>
        <label class="radio-inline">
          <input type="radio" name="p_prefered_day" id="Thu" value="Thursday">Thursday
        </label>
      </div> <!-- end form group -->

      <div class="form-group">
      <label>Prefered Session you would like to attend? *</label>
        <select class="form-control" id="session_time">
          <option value="4:30 pm">4:30 pm</option>
          <option value="5:30 pm">5:30 pm</option>
          <option value="6:30 pm">6:30 pm</option>
        </select>
      </div><!--  end form-group --> 

      <div class="form-group">
      <label>Additional Comments</label>
        <div class="input-group">                  
          <textarea id="p_message" class="form-control" rows="7" required></textarea>
          <span class="input-group-addon"><span class="glyphicon glyphicon-asterisk"></span></span>
        </div><!--  end input group -->
      <p class="help-block text-danger"></p>
      </div><!--  end form-group --> 

    </div><!--  end box pilates -->

    <div class="box booking">

      <div class="form-group">
      <label>What Service Are You Interested In? *</label>
        <select class="form-control" id="services">
          <option value="Manual Therapy">Manual Therapy</option>
          <option value="Sports Physiotherapy">Sports Physiotherapy</option>
          <option value="Dry Needling">Dry Needling</option>
          <option value="Post and Pre operative care">Post and Pre operative care</option>
          <option value="Real Time Ultrasound Imaging">Real Time Ultrasound Imaging</option>
          <option value="Balance and Vestibular treatment">Balance and Vestibular treatment</option>
          <option value="Sports Specific Rehabilitation">Sports Specific Rehabilitation</option>
          <option value="Motor Vehicle Accident">Motor Vehicle Accident</option>
          <option value="Workers Compensation">Workers Compensation</option>            
        </select>
      </div><!--  end form-group --> 

      <div class="form-group">
      <label>Which therapist would you like to see*</label>
        <select class="form-control" id="therapist">
          <option selected="selected">No Preference</option>
          <option value="Kristen">Kristen</option>
          <option value="Tara">Tara</option>        
        </select>
      </div><!--  end form-group --> 

      <div class="form-group">
        <label>Prefered day of the week *</label><br>
        <label class="radio-inline">
          <input type="radio" name="b_pref_day" id="b_Mon" value="Mon-">Mon
        </label>
        <label class="radio-inline">
          <input type="radio" name="b_pref_day" id="b_Tue" value="Tue">Tue
        </label>
        <label class="radio-inline">
          <input type="radio" name="b_pref_day" id="b_Wed" value="Wed">Wed
        </label>
        <label class="radio-inline">
          <input type="radio" name="b_pref_day" id="b_Thu" value="Thu">Thu
        </label>
        <label class="radio-inline">
          <input type="radio" name="b_pref_day" id="b_Fri" value="Fri">Fri
        </label>
      </div> <!-- end form group --> 

      <div class="form-group">
        <label>Prefered time of the day</label><br>
        <label class="radio-inline">
          <input type="radio" name="b_pref_time" id="morning" value="Morning">Morning
        </label>
        <label class="radio-inline">
          <input type="radio" name="b_pref_time" id="afternoon" value="Afternoon">Afternoon
        </label>
      </div> <!-- end form group --> 

      <div class="form-group">
      <label>Addtional Comments</label>
        <div class="input-group">                  
          <textarea id="b_message" class="form-control" rows="7" required></textarea>
          <span class="input-group-addon"><span class="glyphicon glyphicon-asterisk"></span></span>
        </div><!--  end input group -->
      <p class="help-block text-danger"></p>
      </div><!--  end form-group --> 

   </div> <!-- end box booking -->

  <div class="clearfix"></div>

    <div id="success"></div>
    <button id="send_btn" type="submit" class="btn cpcbutton">Send Message</button>
    <p class="help-block"> <span class="glyphicon glyphicon-asterisk green"></span> Required Fields </p>
  </form>

提前致谢。

【问题讨论】:

  • PHP 本身不会发布任何东西。您是否尝试更改通过表单发布到 PHP 的内容?

标签: php html forms


【解决方案1】:

试试这个:

$body = "";
foreach ($_POST as $Field=>$Value) { 
    if($Value != ''){
        $body .= "$Field: $Value\n\n";
    }
}

$to = 'info@zenwebcreative.com.au'; 
$email_subject = "Website Contact Form:  $name";
$email_body = "You have received a new message from your website contact form.\n\n"."Here are the details: $body";
$headers = "From: noreply@yourdomain.com\n";
$headers .= "Reply-To: $email_address"; 

mail($to,$email_subject,$email_body,$headers);
return true;            

我替换了将变量从 $_POST 数组分配给您提供的 sn-p 的所有代码。这基本上与您之前的代码所做的相同。

【讨论】:

  • 感谢您的回答。它确实可以返回文本字段,但我也有选择框和单选按钮,其中的值没有被发布。您的代码可以解释这些元素类型吗?如果我的问题不够具体,请提前道歉。
  • 1.) 这将无一例外地打印所有发布的值——如果你没有看到它,那么其他地方就有问题了。 2.) 您的许多表单元素都缺少 name 属性,这是被 POST 数组拾取的要求。
  • 嗨。我尝试将名称插入选择框和单选组,但表单仍然只返回名称、电子邮件和消息字段。我想出了点问题,但无法确定在哪里或什么。无论如何都感谢您尝试
  • 此答案解决了原始问题——请接受答案。然后,我建议您针对未输入的表单字段的单独问题创建另一个问题。
  • 我发现了我的问题,但您的解决方案是正确的并解决了我的问题。感谢您的帮助
【解决方案2】:

你的foreach-loop 可以正常工作,但是当使用empty() 时,代码看起来更清晰,就像这样(但你已经做了同样的工作!):

foreach ($_POST as $field=>$value) { 
    if (!empty($value)) {
        $body .= "$field: $value\n\n";
    }
}

这会将全局$_POST-array 中非空的所有变量分配给$body-variable。使用它,您不需要其他 $_POST 语句(例如 $message = $_POST['message'];)。唯一的问题是您来自$_POST-array 的所有内容都会被打印(甚至是提交按钮的值!)。

然后您只需将其放入您的mail-function 中,如下所示:

$email_body = "You have received a new message from your website contact form.\n\n";
$email_body .= "Here are the details:\n\n";
$email_body .= "$body";
mail($to, $email_subject, $email_body, $headers);

另一种选择是显式检查每个字段,尽管这会生成更多代码。

if (!empty($_POST['name']))
    $body .= "Name: ".$_POST['name']."\n\n";
if (!empty($_POST['email']))
    $body .= "Email: ".$_POST['email']."\n\n";
if (!empty($_POST['phone']))
    $body .= "Phone: ".$_POST['phone']."\n\n";

这里同样处理如何将它添加到您的邮件功能。

当然还有其他的做事方式,在这两种方式中,我推荐foreach-loop,因为它的代码更少更简洁,应该可以完成同样的工作。如果它也打印“提交”值,您只需添加一段代码即可跳过全局 $_POST 数组的该元素。


您应该有一个语句来防止每次有人直接访问此页面时运行脚本,例如有一个 if ($_POST['submit'] == 'submit')(其中submit 是 HTML 表单中提交按钮的名称和值)语句它包含了所有与邮件相关的代码。这样,只有在提交表单后才会发送邮件。

【讨论】:

  • 感谢您的回答。正如我在上面对 dlporter98 所提到的,您的代码可用于返回文本字段,但不会发布带有值的选择框和单选按钮。你能修改你的代码来解释那些元素类型吗?如果我的问题不够具体,请提前道歉。
  • 嗨奇瑞尔。即使我选择了他的答案,我实际上也实现了您的代码而不是上面的 dlporters。您的两个代码基本上相同并且可以正常工作,但我更喜欢您布置代码的方式。还是谢谢
【解决方案3】:

您应该为您接受的密钥创建一个白名单数组:

$whitelist = array('name', 'email', 'phone');

然后循环遍历数组如下:

foreach($whitelist as $key){
  if(isset($_POST[$key]) && $_POST[$key] != ''){
    $body .= ucfirst($key) . ": " . htmlspecialchars($_POST[$key], ENT_QUOTES) . "\n";
  }
}

foreach 循环遍历数组,isset 检查该字段是否已设置,ucfirst 通过大写第一个字符使密钥在电子邮件中看起来可呈现,htmlspecialcharsENT_QUOTES 标志确保字符已正确转换为电子邮件。

您应该始终为这种类型的循环创建一个白名单,这不仅是出于安全目的,还因为您将循环通过不必要或不相关的密钥,例如:

<button type="submit" name="submit" value="1">Submit</button>

然后您的电子邮件将看到:

Submit: 1

这对收件人来说毫无意义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-25
    • 2013-07-17
    • 2013-03-01
    • 1970-01-01
    • 2014-11-15
    • 1970-01-01
    • 2013-09-30
    • 1970-01-01
    相关资源
    最近更新 更多