【问题标题】:How do I make contact form success message appear in same page如何使联系表成功消息出现在同一页面中
【发布时间】:2013-11-25 06:22:04
【问题描述】:

我的网站是一个带有导航的寻呼机,可链接到同一文档中页面的不同部分。所以我的联系方式是 stie.com/#contact 而不是 site.com/contact.html

我使用链接到 mail.php 的 post 方法以 html 编码我的联系表单。点击提交按钮后,我被重定向到 site.com/mail.php,其中显示“您的消息已成功发送”。我如何获取它以便它显示在联系表单的顶部,因为我没有contact.html 文件可以转换为contact.php 并将php 代码放在我希望显示成功消息的位置?

<div class="row">
<div class="12u">
<form method="post" action="mail.php">
<div>
<div class="row half">
<div class="6u">
<input type="text" name="name" id="name" placeholder="Name" />
</div>
<div class="6u">
<input type="email" name="email" id="email" placeholder="Email" />
</div>
</div>
<div class="row half">
<div class="12u">
<input type="text" name="subject" id="subject" placeholder="Subject" />
</div>
</div>
<div class="row half">
<div class="12u">
<textarea name="message" id="message" placeholder="Message"></textarea>
</div>
</div>
<div class="row">
<div class="12u">
<a href="#" class="button form-button-submit">Send Message</a>
<a href="#" class="button button-alt form-button-reset">Clear Form</a>
</div>
</div>
</div>
</form>
</div>

我的邮件.php

<?php

//GET INFO FROM CONTACT FORM
$name = $_POST['name'];
$email = $_POST['email'];
$subject = $_POST ['subject'];
$message = $_POST['message'];
$from .= $_POST ['email'];
$to = 'email@site.com';

// compose headers
$headers = "From: $email\r\n";
$headers .= "Reply-To: $email\r\n";

//POST SUBMIT
if ($_POST['sumbit']);
    if ($name != '' && $subject != '' && $message !='' && $email != '') {                
            if (mail ($to, $subject, $from, $message, $headers)) { 
            echo '<p>Your message has been sent!</p>';
        } else { 
            echo '<p>Something went wrong, go back and try again!</p>'; 
        }
    } else {
        echo '<p>Please fill in all required fields!!</p>';
    }
?>

【问题讨论】:

  • 阅读 AJAX 请求。
  • @esqew 我会检查 AJAX 感谢您的提示!

标签: php html forms email


【解决方案1】:

您可以在 PHP 中使用 URL 参数:

<?php

$confDisplay = 'display:none;';

// if the url param exists, display confirmation
if(isset($_GET["confirm"]) && $_GET["confirm"]==true){
  $confDisplay = 'display:inline;';
}

?>

    ...
    <div style="<?php echo $confDisplay; ?>">
    Your form has been submitted!
    </div>
    ...

只需将您的表单操作 URL 设置为以 ?confirm=true 结尾的同一页面。

【讨论】:

  • 当提交按钮被点击时,这是否适用于我的 IF 语句?我假设如果我将它放在 IF 语句下方并像上面那样配置每个语句
  • $_GET["confirm"] 询问您的网址中是否包含“确认”。除非您的页面 url 以如下参数为后缀,否则它是错误的:`mysite.php?confirm=true'。在没有确认参数的情况下访问您的页面以隐藏确认 div。它只会显示您是否将它包含在 url 中,这就是您的表单提交的原因,并且只有表单提交操作 url 包含它。其他一切都只是正常指向页面。
  • 此方法适用于传递幼稚的参数,但它总是容易受到威胁,因此请避免这种情况,而是在同一页面中编写 html+php 代码!
  • @John 所以使用这种方法我无法在“您的表单已提交!”旁边显示其他消息。对吗?
  • @ShivanshuSrivastava 您能否提供详细信息?我整天都在做这件事,让它开始工作
【解决方案2】:

让您的操作字段为空。输入action="" 而不是action="mail.php" 然后在您的联系页面中包含您的mail.php 内容。如您所知,您也必须将该页面保存为 PHP;例如,mycontactform.php。通过这种方式,您可以更好地控制“您的消息已提交”消息的内容和格式。如果您将 mail.php 分开,则无法在 mycontactform.php 中处理部门。

您正在使用的 PHP 代码的安全性和漏洞应该在您完成页面编码并测试它以您所需的格式启动并运行后解决,因为它需要对 PHP 约定和用法进行更深入的研究。来源:A Set of Step by Step Tutorials Using HTML5, CSS3 and PHP (8)

【讨论】:

    【解决方案3】:

    请注意,您的脚本 mail.php 容易受到标头注入攻击。您需要转义变量 $_POST['email']。您必须删除特殊字符 \n\r。这可以通过使用str_replace 函数轻松实现。

    【讨论】:

    • 我不懂转义变量。如果我删除 \n 和 \r no,我会失去一些功能?
    • 每个邮件标头由两个特殊字符 \r\n (CRLF) 分隔。您的代码中定义的标头 FromReply-To 直接使用从联系表单收到的用户电子邮件地址。规则 #1 是永远不要相信用户输入。用户可以添加这两个特殊字符并轻松注入邮件标题。例如,他可以键入:addr@dom.tld\n\rBcc: xxx@yyy.tld, xxx2@yyy2.tld。它还会将邮件发送到 xxx@yyy.tld 和 xxx2@yyy2.tld,我们不希望这样。有些人可以用它来发送垃圾邮件地址。因此,您需要检测字符 \n 和 \r 并将它们删除。
    • What does "escape" mean。我不应该用这个词。
    猜你喜欢
    • 2017-04-19
    • 1970-01-01
    • 2015-10-27
    • 2020-05-30
    • 1970-01-01
    • 1970-01-01
    • 2015-07-13
    • 1970-01-01
    • 2014-05-05
    相关资源
    最近更新 更多