【问题标题】:Adding input field to PHP emailer only if it exists, how?仅当存在时才将输入字段添加到 PHP 电子邮件,如何?
【发布时间】:2010-07-21 00:58:56
【问题描述】:

我有一个包含“姓名”和“电子邮件”输入的表单。另一个用于“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....等”

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

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

汤姆

【问题讨论】:

  • $data-1 不是有效的变量名。它将被解释为$data - 1

标签: php jquery


【解决方案1】:

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

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

【讨论】:

  • 如果传入的数组不是关联数组,可以使用foreach($data as $i =&gt; $field)。也就是说,这并不意味着潜在的恶意用户不能传入关联数组。当然,我们可以提防这一点。
  • 我想我一直使用foreachif ((int) $key != $key) continue; 但是是的,我想这两种方式都没有关系。然而,即使使用for 循环,也可以发送非数字键(并导致循环出现问题)。编辑:我摆脱了is_int(),因为我认为 PHP 默认将这些键作为字符串。
  • 您好,感谢您的回复,不幸的是我收到了这个错误:解析错误:语法错误,错误的意外 T_IF 是指以 if((int) 开头的行我做错了什么?
  • @thom,抱歉我有错字。用我修改过的代码再试一次。
  • 再次感谢,我尝试了新代码并且脚本通过了,但它没有输入数据。只是姓名和电子邮件
【解决方案2】:

作为一般的点表格处理是诡计,并且对于粗心的人来说有很多陷阱。这个帖子值得一看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]。但是,我们将数字匹配模式括在括号中,因此将捕获的数字放入 $matches1 中,然后我们使用它来键入 $rawData 数组。在这种情况下,$rawData 的键 = 23、999 和 5。

【讨论】:

  • 谢谢你的回复,这有点过头了,需要一段时间才能理解它,这真的是我第一次使用php
【解决方案3】:

使用这样的东西:

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

【讨论】:

    猜你喜欢
    • 2022-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-07
    • 1970-01-01
    • 2014-05-22
    • 2016-11-26
    • 2015-05-06
    相关资源
    最近更新 更多