繁体   English   中英

仅在存在输入字段的情况下将输入字段添加到PHP emailer中,如何?

[英]Adding input field to PHP emailer only if it exists, how?

我有一个带有“名称”和“电子邮件”输入的表格。 另一个是“ data-1”。 用户可以单击添加按钮,jQuery将根据需要动态添加“ data-2”,“ data-3”等的输入。

该表单将发布到PHP电子邮件程序脚本,该脚本将验证字段并将数据放置到用于发送邮件的模板中。

如果创建了输入“ data-2”,“ data-3”等,该如何添加? 如果不是,我该如何避免电子邮件模板中的空白?

(有没有一种方法可以编写它,因此,如果收到该帖子,请添加它,如果不执行任何操作,则不做任何事情?)

这是我使用的代码示例:

$name = $_POST['name'];
$email = $_POST['email'];
$data-1 = $_POST['data-1'];

(我是否需要添加:$ data-2 = $ _POST ['data-2']和$ data-3 ....直到设置值等于10?)

$e_body = "You were contacted by $name today.\r\n\n";
$e_data = "Data Set 1: $data-1.\r\n\n"; 

如果它们存在,我想在这里显示“数据集2/3/4 .... etc”

$e_reply = "You can contact $name via email, $email";

$msg = $e_body . $e_data . $e_reply;

if(mail($address, $e_subject, $msg, "From: $email\r\nReply-To: $email\r\nReturn-Path: $email\r\n")) {

我希望这很清楚,并感谢您的任何帮助或指导

托姆

为此,您应该使用输入数组。

在HTML中,设置表单元素的名称以符合以下命名方案: data[]

然后,提交表单后,您可以简单地循环访问此数组,并在循环中向电子邮件中添加字段:

$name = $_POST['name'];
$email = $_POST['email'];
$data = $_POST['data'];
$e_data = '';

foreach($data as $i => $d) {
   if((int) $i != $i) continue; //thanks Alex
   $e_data .= "Data Set {$i}: " . $d . "\r\n\n";
}

//...

在客户端,您的代码应如下所示:

<input type="hidden" name="data[]"/>

使用这样的东西:

if(isset($_POST['data-1']))
{
    // $_POST['data-1'] exists, include it.
}
else
{
    // $_POST['data-1'] doesn't exists, don't include it.
}

一般而言,表单处理是技巧,并且对粗心的人有很多陷阱。 值得一看有关最佳实践表单处理的帖子

问题的症结在于,您不知道在$ _POST数组中将获得多少个“数据”值。 答案很简单,就是遍历$ _POST数组以查找您的数据值。

$rawData = array();
foreach ($_POST as $index => $value) {
// Test for a "data-n" index
    if ((preg_match('#^data-\d+#i', $index, $matches))) {
        $rawData[] = $value;
    }
}

上面的代码将使用格式为'data-0','data-1'等的键复制所有$ _POST值。然后,您可以过滤和验证这些值。

我们要做的就是遍历$ _POST以获取每个键和值。 然后,我们使用preg_match测试密钥,看它是否以字符串'data-'开头,然后是一个或多个数字。 如果是这样,我们会将其添加到原始(未经过滤,未经验证的)数据中。

在此示例中,我们可以将preg_match替换为strpos函数-

if ( strpos  ($index, 'data-') === 0) {

preg_match的使用为我们提供了更大的灵活性。 例如,如果您想捕获“ data-n”键的数字部分-“ data-23”,“ data-999”,“ data-5”等,则将if语句更改为

if ((preg_match('#^data-(\d+)#i', $index, $matches))) {
    $rawData[$matches[1]] = $value;
}

变量$ matches是一个数组,用于捕获搜索结果。 完整的匹配字符串是$ matches [0]。 但是,我们将数字匹配模式括在括号中,因此将捕获的数字放入$ matches 1中 ,然后将其用于键入$ rawData数组。 在这种情况下,$ rawData将具有键= 23、999和5。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM