【问题标题】:Multiple field PHP form submission多字段PHP表单提交
【发布时间】:2016-12-08 02:23:06
【问题描述】:

我遇到的问题是我想将表单中多个字段的数据通过PHP发送到一封电子邮件中,相关代码如下:

$mailcheck = spamcheck($_POST['inputemail']);
        if ($mailcheck==FALSE)
          {
          echo "Invalid input";
          }
        else
          {
          // This still needs to be debugged online as soon as possible
          $from = $_POST['inputemail'];
          $name = $_POST['inputname'];
          $phone = $_POST['inputphone'];
          $date = $_POST['inputdate'];
          $time = $_POST['inputtime'];
          $data = $_POST['inputprotection'];
          $subject = $_POST['inputdropdown'];
          $message = $_POST['inputmessage'];
          $message = wordwrap($message, 70);
          mail("UP498701@myport.ac.uk",$subject,$message,"From: $from\n" . "Name: $name\n" . "Phone: $phone\n" . "Date: $date\n" . "Time: $time\n" . "Keep Data? $data\n");
          echo "Thank you for sending us feedback, you'll be redirected in 5 seconds";
          }
        }

这是我声明要作为电子邮件标题传递的所有信息的地方。当前的 PHP 通过语法检查,只要发送包含$to$subject$message 的电子邮件都可以,但 $header 仅通过最后一部分(保留数据?$data\n) .当我删除所有其他字段并仅保留 $data 部分时,电子邮件将停止发送任何$header。我也有重定向的问题,它已从以下代码中删除,并将在当前问题解决后立即插入。当前完整的 PHP 是:

<html>
<body>

    <?php
    function spamcheck($field)
      {
      // Sanitize e-mail address
      $field=filter_var($field, FILTER_SANITIZE_EMAIL);
      // Validate e-mail address
      if(filter_var($field, FILTER_VALIDATE_EMAIL))
        {
        return TRUE;
        }
      else
        {
        return FALSE;
        }
      }
    ?>

    <?php 
    if (isset($_POST['inputemail']))
        {
        $mailcheck = spamcheck($_POST['inputemail']);
        if ($mailcheck==FALSE)
          {
          echo "Invalid input";
          }
        else
          {
          // This still needs to be debugged online as soon as possible
          $from = $_POST['inputemail'];
          $name = $_POST['inputname'];
          $phone = $_POST['inputphone'];
          $date = $_POST['inputdate'];
          $time = $_POST['inputtime'];
          $data = $_POST['inputprotection'];
          $subject = $_POST['inputdropdown'];
          $message = $_POST['inputmessage'];
          $message = wordwrap($message, 70);
          mail("UP498701@myport.ac.uk",$subject,$message,"From: $from\n" . "Name: $name\n" . "Phone: $phone\n" . "Date: $date\n" . "Time: $time\n" . "Keep Data? $data\n");
          echo "Thank you for sending us feedback, you'll be redirected in 5 seconds";
          }
        }
    ?>

</body>

暂时托管在http://luke-hale.com/temp/contact.html。我确信这只是我被误导的一个例子,但任何帮助都会很棒,干杯!

编辑:

好的,问题按以下顺序排序:

          $subject = $_POST['inputdropdown'];
          $message = $_POST['inputmessage'] . "\r\n\r\n" . $_POST['inputname'];
          $message = wordwrap($message, 70);
          $headers = "From: " . $_POST['inputemail'];
          mail("UP498701@myport.ac.uk",$subject,$message,$headers);
          echo "Thank you for sending us feedback, you'll be redirected in 5 seconds";

虽然没有在任何地方显示 $headers ,但我对此并不太在意,接下来是重定向,我通常会通过以下方式运行:

header("refresh:5;url=http://www.domain.com")

虽然这在之前不能正常工作,但我会在测试时应用编辑以供任何人将来参考。

编辑

所以表单有效,但重定向无效。该网站仍然托管在同一个域上,但现在完整的 PHP 看起来像这样:

<html>
<body>

    <?php
    function spamcheck($field)
      {
      // Sanitize e-mail address
      $field=filter_var($field, FILTER_SANITIZE_EMAIL);
      // Validate e-mail address
      if(filter_var($field, FILTER_VALIDATE_EMAIL))
        {
        return TRUE;
        }
      else
        {
        return FALSE;
        }
      }
    ?>

    <?php 
    if (isset($_POST['inputemail']))
        {
        $mailcheck = spamcheck($_POST['inputemail']);
        if ($mailcheck==FALSE)
          {
          echo "Invalid input";
          }
        else
          {
          $subject = $_POST['inputdropdown'];
          $message = "Name: " . $_POST['inputname'] . "\r\n\r\n" . "Email: " . $_POST['inputemail'] . "\r\n\r\n" . "Phone: " . $_POST['inputphone'] . "\r\n\r\n" . "Date: " . $_POST['inputdate'] . "\r\n\r\n" . "Time: " . $_POST['inputtime'] . "\r\n\r\n" . "Retain Data? " . $_POST['inputprotection'] . "\r\n\r\n" . "Message: " . $_POST['inputmessage'];
          $message = wordwrap($message, 70);
          $headers = "From: " . $_POST['inputemail'];
          mail("UP498701@myport.ac.uk",$subject,$message,$headers);
          echo "Thank you for sending us feedback, you'll be redirected in 5 seconds";
          }
        }
    header("refresh:5;url=http://www.domain.com")
    ?>

</body>

表单仍然可以正常发送,但返回表明无法传递以“header”开头的行,因为浏览器数据已被修改。我不确定我做了什么或在哪里,如果有人可以伸出援助之手,那就太好了!

最终编辑

我最终的、完全可用的代码:

<?php
function spamcheck($field)
{
$field=filter_var($field, FILTER_SANITIZE_EMAIL);
if(filter_var($field, FILTER_VALIDATE_EMAIL))
{
return TRUE;
}
else
{
return FALSE;
}
}
?>
<?php
ob_start();
if (isset($_REQUEST['inputemail'])&&($_REQUEST['inputname'])&&($_REQUEST['inputmessage']))
{
$mailcheck = spamcheck($_POST['inputemail']);
if ($mailcheck==FALSE)
{
echo "Invalid email, you'll be redirected ";
header("refresh:5;url=http://www.luke-hale.com/");
}
else
{
$subject = $_POST['inputdropdown'];
$message = "Name: " . $_POST['inputname'] . "\r\n\r\n" . "Email: " . $_POST['inputemail'] . "\r\n\r\n" . "Phone: " . $_POST['inputphone'] . "\r\n\r\n" . "Date: " . $_POST['inputdate'] . "\r\n\r\n" . "Time: " . $_POST['inputtime'] . "\r\n\r\n" . "Retain Data? " . $_POST['inputprotection'] . "\r\n\r\n" . "Message: " . $_POST['inputmessage'];
$message = wordwrap($message, 70);
$headers = "From: " . $_POST['inputemail'];
mail("UP498701@myport.ac.uk",$subject,$message,$headers);
echo "Thank you for your messgae, I'll get back to you as soon as possible! You'll be redirected in 5 seconds.";
}
header("refresh:5;url=http://www.luke-hale.com/");
}
else
{
echo "You did not fill all the required fields, please try again.";
header("refresh:5;url=http://www.luke-hale.com/");
}
?>

【问题讨论】:

    标签: php html forms email multiple-instances


    【解决方案1】:

    尝试将表单数据放入$message 变量中,在每个属性后插入\n 以换行。不要使用标题。

    【讨论】:

    • 干杯!您是否也知道如何解决当前不起作用的重定向?
    • 如何重定向用户?通常你会使用: header("Location: domain/page.php"); 如果你在同一个域上重定向,不要使用绝对路径,而是使用相对路径。
    • "HTTP/1.1 需要一个绝对 URI 作为 » Location 的参数:包括方案、主机名和绝对路径,但一些客户端接受相对 URI。" php.net/manual/en/function.header.php
    • 试试这个:header("位置:http://".$_SERVER["HTTP_HOST"].$_SERVER["PHP_SELF"]);这将解析为绝对路径,而不会静态地将其放入您的自我中。
    • 对不起,我想我可能在上次编辑后措辞有误,标头函数语法不是问题,问题是在给定位置使用标头导致电子邮件发送,将文本传递给浏览器的回声,但随后在下面给出错误。输出是这样的 - 感谢您向我们发送反馈,您将在 5 秒内被重定向警告:无法修改标头信息 - 标头已发送(输出开始于 /home/content/06/11062406/html/luke-hale /temp/contactform.php:4) 在 /home/content/06/11062406/html/luke-hale/temp/contactform.php 第 43 行
    【解决方案2】:

    Location 和 Refresh 都需要绝对 URI

    header('Location: http://www.domain.com');
    

    邮件示例:
    https://stackoverflow.com/a/22833890/3489793
    https://stackoverflow.com/a/22831825/3489793

    mail("Your Email Address Here",$subject,$therest,"subject: $subject\n");   
    

    你是这么说的: “邮件功能也不是问题,正确的语法是”mail($to,$subject,$message,$headers,$parameters)

    解释:

    your email adress = $to  
    $subject = $subject  
    $therest = $message (rename it if you want)  
    "subject: $subject\n" = the header (change it to $headers if you want that)
    

    标题示例(如documentation

    $headers = 'From: webmaster@example.com' . "\r\n" .
        'Reply-To: webmaster@example.com' . "\r\n" .
        'X-Mailer: PHP/' . phpversion();
    

    【讨论】:

    • 标题行不是问题,我通过另一种形式使用了相同的代码,它工作正常,实际上更好的做法是使用 ("refresh:5;url=domain.com")在大多数情况下。问题是这里的错误:无法修改标头信息 - 标头已由(输出开始于/home/content/06/11062406/html/luke-hale/temp/contactform.php:4)在/给出了 home/content/06/11062406/html/luke-hale/temp/contactform.php”。虽然我看不到之前在哪里设置了标题?
    • 邮件功能也不是问题,正确的语法是mail($to,$subject,$message,$headers,$parameters)
    • 你的 php 的顶部 put ob_start(); php.net/manual/en/function.ob-start.php
    • 所有可能性都在stackoverflow.com/a/8028987/3489793中描述
    【解决方案3】:

    你可以在你的 PHP 脚本底部回显一个 Javascript,而不是重定向,像这样:

    $url = "url";
    $time = 5000 // time in milliseconds
    
    print "<script>window.setTimeout(function(){window.location='".$url."'},".$time.")       </script>"
    

    【讨论】:

    • 很遗憾,它不起作用,luke-hale.com/temp/contact.html 目前已托管。它确实打印数据但不重定向
    • 它在这里:mail("UP498701@myport.ac.uk",$subject,$message,$headers); $url = "luke-hale.com"; $时间 = 5000; print"window.setTimeout(function(){window.location='".$url."'},".$time.")";
    • 在 mail() 函数上做一个条件: if(mail(params)) { print "the javascript I provided"; } 在你的 PHP 脚本的底部,它将在你的打开 标记 之前
    猜你喜欢
    • 2013-09-14
    • 2021-05-18
    • 1970-01-01
    • 1970-01-01
    • 2016-01-20
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多