【问题标题】:PHP Contact Form - Want to stay on my site after sendPHP 联系表 - 发送后希望留在我的网站上
【发布时间】:2011-04-20 11:34:05
【问题描述】:

我正在创建一个 PHP 联系表单,我所拥有的只是我拥有的 php 脚本的一个小问题,当电子邮件发送一个新的“谢谢”时页面被调用。因此带有联系表单的实际网站消失了,但我不希望发生这种情况。

如果点击发送按钮,我想留在我的网站上,显示一个空的联系表格,可能在联系表格下方只有一行,说“谢谢.....”

我怎样才能做到这一点? strong> 是否有任何代码 sn-p 可以向我解释我必须包含在我的 html 和我的 php 文件中的内容?希望它会...以下是我的 php 现在的结束方式。

// send Email 
if (@mail( $empfaenger, htmlspecialchars( $betreff ), $mailbody, $mailheader ))
{
    // if email was successfully send
    echo 'Thank you for your Email. We will get in touch with you very soon.';
}

编辑
@FreekOne
目前我正在使用您的代码稍作修改,因为我想让谢谢和/或错误面板滑出并让文本淡入。脚本正在接受我的代码(因为它仍在工作)但实际上我不能看到文本实际上淡入。我已经看到了文本淡入的滑动面板示例。所以这似乎是我所做的一种错误的编码。
如果需要,请在此处查看代码:
http://jsbin.com/ohuya3
也许您可以为我指明正确的方向。当然,这里的所有人都会提供帮助。

【问题讨论】:

    标签: php forms echo contact


    【解决方案1】:

    设置表单以将数据发送到同一页面,并让您的脚本监听提交。比如:

    contact.php

    <?php
    // Check if form was previously submitted
    if(isset($_POST['myFormSubmitted'])) {
        // Do your form processing here and set the response
        $response = 'Thank you for your Email. We will get in touch with you very soon.';
    }
    ?>
    <!-- HTML here -->
    <?php
    if (isset($response)) { // If a response was set, print it out
        echo $response;
    }
    ?>
    <form method="POST" action="contact.php">
        <!-- Your inputs go here -->
        <input type="submit" name="myFormSubmitted" value="Submit">
    </form>
    <!-- More HTML here -->
    

    更新

    考虑到提供的额外信息,我个人会通过 AJAX 使用 jQuery 来完成。首先,为结果设置表单和容器:

    HTML

    <form id="myForm" method="POST" action="contact.php">
        <input type="text" id="name" name="name">
        <input type="text" id="email" name="email">
        <input type="text" id="message" name="message">
        <input type="submit" name="myFormSubmitted" value="Submit">
    </form>
    <div id="formResponse" style="display: none;"></div>
    

    然后设置处理提交数据并输出响应的php脚本。

    PHP (contact.php)

    <?php
    if(isset($_POST['myFormSubmitted'])) {
        // Do your form processing here and set the response
        echo 'Thank you for your Email. We will get in touch with you very soon.';
    }
    ?>
    

    最后,jQuery 脚本将在不离开页面的情况下提交您的表单并将结果插入到您的结果容器中(具有漂亮而简单的淡入效果)。

    jQuery

    $("#myForm").submit(function() {
        $.post('contact.php', {name: $('#name').val(), email: $('#email').val(), message: $('#message').val(), myFormSubmitted: 'yes'}, function(data) {
            $("#formResponse").html(data).fadeIn('100');
            $('#name, #email, #message').val(''); /* Clear the inputs */
        }, 'text');
        return false;
    });
    

    希望这会有所帮助!

    【讨论】:

    • @FreekOne 我认为您的解决方案非常接近我想要的,但我需要一些时间来弄清楚如何使用它。这是一种完全不同的方法。现在我正在使用带有文本占位符的邮件正文,如下所示
      $mailbody = file_get_contents('mailbody.txt'); $mailbody = str_replace('###NAME###', htmlspecialchars($name), $mailbody); $mailbody = str_replace('###EMAIL###', $email, $mailbody); $mailbody = str_replace( '###NACHRICHT###', htmlspecialchars( $nachricht ), $mailbody );

      我不再需要这个了 - 对吧?但是如果禁用 javascript 会发生什么?
    • 为什么我不能在该评论部分使用任何代码,对此感到抱歉.......希望你能理解......
    • 不,您仍然需要它,并且您还必须定义 $name$email$nachricht。如果 JS 被禁用,表单仍然会正确提交,尽管用户只会看到一个带有“谢谢”消息的白页。
    • 我也很好奇如何优雅地降级为您从(文件a)提交的文件之外存在的php脚本,同时仍保持文件a的html结构......
    • @Hardy,您需要在 cmets 中的代码周围使用 `,就像在问题/答案中一样,尽管我强烈建议您在任何其他代码的任何地方编辑您的原始问题,格式正确,因为它更容易阅读。
    【解决方案2】:

    以下所有这些答案都是错误的。它会让您偶尔收到双倍消息的垃圾邮件并让客户感到困惑。

    虽然解决方法有点棘手

    首先你必须学习黄金法则:
    处理 POST 请求后,您的代码应使用 GET 方法重定向浏览器。没有例外。

    所以,先弄成这样

    if ($_SERVER['REQUEST METHOD']=='POST') {
      mail( $empfaenger, htmlspecialchars( $betreff ), $mailbody, $mailheader );
      header("Location: ".$_SERVER['PHP_SELF']);
      exit;
    }  
    // your form goes here
    

    无论如何你都应该这样做。

    接下来,如果你还想展示这条无用的信息,你有几种方法可以做到。

    • 使用 GET 参数
    • 使用 cookie
    • 支持 AJAX。

    例如,使用 GET 参数

    if ($_SERVER['REQUEST_METHOD']=='POST') {
      mail( $empfaenger, htmlspecialchars( $betreff ), $mailbody, $mailheader );
      header("Location: ".$_SERVER['PHP_SELF']."?thanks");
      exit;
    }  
    if ($_SERVER['QUERY_STRING']=='thanks') {
      echo 'Thank you for your Email. We will get in touch with you very soon.';
    }
    // your form goes here
    

    【讨论】:

    • 我个人一直都是这样做的,从来没有一次我收到过双重信息。但是,我对您所说的关于在处理 POST 请求后使用 GET 重定向的内容很感兴趣。这是为了避免重复发布还是有更多的好处?
    • @FreekOne - 基本上,如果用户在 POST 请求后按 F5/刷新,系统会提示他们重新发送数据。用户说是的,他们的数据将被第二次处理。
    • @Co.弹片
      感谢您的帮助,我确实理解您所说的,但恐怕我必须解释更多细节。联系表格是 1 页垂直/水平滚动设计的一部分。这就是访问者永远不应该离开网站的原因。因此,它被设置为一个普通的 html 页面,其中包含带有 action="mail.php" 的表单,这是我的单独 php 文件。在那个 php 文件中,我有我在开头发布的 sn-p 中的代码。不,我试图弄清楚我必须在哪里修改。我的 php 文件和 html 文件中有什么。
    • 我真的必须留在我的网站上,访问者应该知道他的邮件已发送出去,我必须将其分开保存,php 文件和常规 html 文件。
    • @Hardy 我不明白你为什么总是说不要离开你的网站。什么叫“网站”?离开它的原因是什么?
    猜你喜欢
    • 1970-01-01
    • 2021-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-18
    • 2017-08-12
    • 1970-01-01
    • 2023-03-23
    相关资源
    最近更新 更多