只有在存在时才将输入字段添加到PHP电子邮件中,如何?

时间:2010-07-21 00:58:56

标签: php jquery

我有一个表单,其中包含“name”和“email”的输入。另一个是'数据-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 ......等”的地方

$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")) {

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

3 个答案:

答案 0 :(得分:2)

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

在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[]"/>

答案 1 :(得分:0)

使用类似的东西:

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

答案 2 :(得分:0)

作为一般点,表格处理是技巧,并且对于粗心大意有许多陷阱。值得一看这篇文章on best practice form processing

问题的关键在于你不知道在$ _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-'开头,后跟一个或多个数字。如果是这样,我们将其添加到我们的原始(未经过滤,未经验证)数据中。

在这个例子中,我们可以用strpos函数替换preg_match -

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。