【问题标题】:PHP: Send an email with the data the user filled in a form, only after the user hit "send"? (the data is an array)PHP:仅在用户点击“发送”后发送一封包含用户填写表格数据的电子邮件? (数据是一个数组)
【发布时间】:2011-10-17 02:57:04
【问题描述】:

我是 PHP 和一般编程的新手,我仍在阅读我的手册。我正在尝试一些练习,并创建一些我自己的简单测试。

我有一个表单,其中包含一些复选框和选择项。用户填写表单并显示一些输出。这就像一个小游戏,用户选择一些答案,脚本会显示一个数字,即他/她的分数。

现在,我希望在每次用户完成游戏时收到一封电子邮件,其中包含所有答案。

用户填写一些复选框并选择项目,所以,所有答案都是数组(所以,我试过 $message_answer2 = $_POST['answer2']; 它不会工作)。

所以,我试过了:

$to   = 'myown@mail.com';
$subject = 'New Game '.date("m/d/Y h:m:s");
$message_answer2 = join(', ', $_POST['answer2']);
mail($to, $subject, $message_answer2);

这有两个问题:

  • 出现 PHP 错误:Warning: join() [function.join]: Invalid arguments pass in ...

  • 每次我重新加载页面时都会发送一封电子邮件(一封空白电子邮件)。只有在用户点击表单的“发送”按钮后才能发送电子邮件。

如果有人能帮我解决这个问题,我将不胜感激 :)

谢谢!!

蔷薇

【问题讨论】:

  • 第一个问题使用 implode 代替。
  • @Aurelio:为什么? join() 是 implode() 的别名,内部使用与 implode() 完全相同的代码。
  • 使用 implode 错误仍然存​​在:Warning: implode() [function.implode]: Invalid arguments passed
  • @MarcB 对不起。我忘了这只是一个别名。

标签: php arrays forms email


【解决方案1】:

你应该试试这个:

if (isset($POST['answer2'])) {
    $to   = 'myown@mail.com';
    $subject = 'New Game '.date("m/d/Y h:m:s");
    $message_answer2 = join(', ', $_POST['answer2']);
    mail($to, $subject, $message_answer2);
}

我假设当用户提交您将其发布到当前页面的表单时。如果是这种情况,那么当您最初加载页面时, $_POST['answer2'] 中没有数据集,这就是您收到错误的原因,然后发送空白消息,因为没有数据要发送.添加仅当声明将发送电子邮件时才会发送,这样只有在“answer2”中的页面上发布数据时才会发送电子邮件。

【讨论】:

  • 谢谢!如果我有更多值 answer3、4、5 等,我应该使用 elseif 吗?有一些响应具有“已经检查”的默认选项,因此,即使用户没有做任何事情,它们也已经被检查过。
  • 如果您要拥有多个值,我建议将数据作为 JSON 对象发送。然后从 POST 数据中解析它。
  • 我已经尝试了该单个字段并发送了电子邮件,但两个错误仍然存​​在(发送了 2 封邮件,一个是因为我重新加载了页面,另一个是因为我点击了“发送”,并且“警告:join()[function.join]:传递的参数无效”错误仍然出现。
  • 阅读其他答案。在谈论 join() 时,Marc B 拥有您需要的正确信息。
  • 最好改为if ($_SERVER['REQUEST_METHOD'] === 'POST') { ...}。与检查字段的存在不同,这是 100% 可靠的。您可能会重命名字段并忘记更新 if()
【解决方案2】:

join() 用于数组。除非您在表单的字段名称 <input name="answer2[]"> 上使用了 PHP 特定的数组表示法,否则 PHP 将 NOT$_POST['answer2'] 设为数组 - 它只是一个普通字符串。

如果你的表单看起来像

<input name="answer2" ...>
<input name="answer2" ...>

那么您仍然只能在 $_POST 中获得一个字符串值。您必须使用 [] 表示法告诉 PHP 它应该创建一个数组并将每个单独的 answer2 添加到该数组中。当不在数组模式下时,PHP 将简单地用它在表单数据中找到的每个 answer2 值覆盖 $_POST['answer2']

【讨论】:

  • 请注意:是的,我已经放了方括号:answer2[] :)
  • 我建议做一个var_dump($_POST['answer2']),然后确保它作为一个数组通过。如果它是一个数组,您将不会收到该错误消息。
  • 谢谢!我已更改代码以将其替换为 var_dump,并且电子邮件已发送,空白,但它在网页上打印:array(1) { [0]=> string(12) "answer2" }
  • 这是我在表格中的内容:
  • 在这种情况下看起来不错。执行下面 Tyler 建议的 if() 检查,以在最初加载表单时跳过发送电子邮件。只有当表单通过 POST 提交时,他的版本才会发送它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-20
  • 1970-01-01
  • 2021-04-29
  • 2021-10-07
  • 1970-01-01
  • 2011-07-14
  • 1970-01-01
相关资源
最近更新 更多