PHP表单-提交后留在同一页

47

我有一个位于文件contact.html中的PHP表单。

该表单由文件processForm.php处理。

当用户填写表单并点击提交时,processForm.php会发送电子邮件并将用户重定向到- processForm.php, 在页面上显示一条消息:"成功!您的消息已发送。"

我对PHP不是很了解,但我知道调用此操作的动作是:

// Die with a success message
die("<span class='success'>Success! Your message has been sent.</span>");

如何在不重定向到processForm.php页面的情况下将消息保留在表单div中?

如果需要,我可以发布整个processForm.php,但它很长。


6
使用 AJAX 或者将表单提交到同一页,我更倾向于将表单提交到同一页。 - Nick Maroulis
header('contact.html?result=success'); - BlitZ
http://www.phptutorialforbeginners.com/2013/01/jquery-ajax-tutorial-and-example-of.html - underscore
类似的问题(稍作修改)如下:php,在提交后使用同一页的表单 - Bassem
我应该把头文件放在contact.html还是processForm.php中? - mewebs
http://www.html-form-guide.com/php-form/php-form-action-self.html - Mawg says reinstate Monica
11个回答

57

为了在提交时留在同一页,您可以将表单标签中的action留空(action ="")或者完全省略。

关于消息,创建一个变量($message = "Success! You entered: ".$input;"),然后使用<?php echo $message; ?>在页面上想要显示消息的位置输出该变量。

像这样:

<?php
$message = "";
if(isset($_POST['SubmitButton'])){ //check if form was submitted
  $input = $_POST['inputText']; //get input text
  $message = "Success! You entered: ".$input;
}    
?>

<html>
<body>    
<form action="" method="post">
<?php echo $message; ?>
  <input type="text" name="inputText"/>
  <input type="submit" name="SubmitButton"/>
</form>    
</body>
</html>

3
你检查过你的代码了吗? 1)在第一次运行之前,你会得到“未定义变量消息”(当然!) 2)然后在每次提交时,都会加载一个新表单显示该消息,并且它们都会在浏览器历史记录中累积! 为什么不在发布前检查你们的代码呢? - Apostolos
@Apostolos,我该如何正确地使用这个例子?需要做哪些更改? - Lyux
我记不清了。大约一年前我就没有再使用PHP了,而且目前也没有可用的Apache服务器进行测试。很抱歉。但是从我记得的来看,我成功地使用“include”保持在同一页(即PHP文件)中... - Apostolos
1
在“echo $message;”周围添加“if(isset($message)){...}”以确保不再出现“Notice: Undefined variable message”错误。 - Tom Groot
使用代替怎么样?有什么优缺点? - Peter Mortensen

19

保持思路一致的最佳方式是将内容发布在同一页上:

<form method="post" action="<?=$_SERVER['PHP_SELF'];?>">

1
需要注意的是,该方法未通过W3验证器的HTML验证检查,因为它显示“表单元素上属性action的值无效:必须非空。”尽管它确实有效,但HTML打印出来像这样,导致了错误:<form name="frmContactUs" action="" method="post"> - Kendall
这里有一个代码示例,网址为http://www.html-form-guide.com/php-form/php-form-action-self.html。 - Mawg says reinstate Monica
这当然是可以理解的,并且这不会改变任何事情,因为它与 action ="" 相同,而此前已经提到过了。 - Apostolos
2
注意,您应该使用htmlspecialchars($_SERVER['PHP_SELF'])。否则,如果有人在URL中放置JS,则会受到xss攻击的影响。 - Mosset Jérémie
实际生成的HTML是什么?您能否在您的答案中添加一个示例? - Peter Mortensen
显示剩余2条评论

16

有两种方法可以做到这一点:

  1. 将表单提交到同一页:使用PHP脚本处理提交的表单。(可以通过将表单的 action 设置为当前页面URL来实现。)

if(isset($_POST['submit'])) {
    // Enter the code you want to execute after the form has been submitted
    // Display Success or Failure message (if any)
  } else {
    // Display the Form and the Submit Button
}
  • 使用 AJAX 表单提交,对于初学者来说比方法 #1 略微有些困难。


  • 是的,这个方法可以部分地解决问题。虽然结果会在新页面中显示,你不会停留在同一页上,但这比起在浏览器历史记录中建立多个相同 PHP 的副本要好得多,因为你必须返回到第一个页面。 - Apostolos
    @Apostolos - 如果action(在<form>标签内)设置为当前页面的URL(或仅为#),则将重新加载相同的页面。(不是新窗口。) - ashleedawg

    9
    您可以在表单操作中使用#动作:
    <?php
        if(isset($_POST['SubmitButton'])){ // Check if form was submitted
    
            $input = $_POST['inputText']; // Get input text
            $message = "Success! You entered: " . $input;
        }
    ?>
    
    <html>
        <body>
            <form action="#" method="post">
                <?php echo $message; ?>
                <input type="text" name="inputText"/>
                <input type="submit" name="SubmitButton"/>
            </form>
        </body>
    </html>
    

    这个解决方案是否会受到 URL 中的 JavaScript 攻击,就像在 这条评论 中所建议的那样?谢谢。 - user1934286

    5

    朋友,使用这种方式,就不会出现“未定义变量消息”,而且它也能正常工作。

    <?php
        if(isset($_POST['SubmitButton'])){
            $price = $_POST["price"];
            $qty = $_POST["qty"];
            $message = $price*$qty;
        }
    
            ?>
    
        <!DOCTYPE html>
        <html>
        <head>
            <title></title>
        </head>
        <body>
            <form action="#" method="post">
                <input type="number" name="price"> <br>
                <input type="number" name="qty"><br>
                <input type="submit" name="SubmitButton">
            </form>
            <?php echo "The Answer is" .$message; ?>
    
        </body>
        </html>
    

    4
    您可以看下面的例子,了解在同一页上使用表单操作的示例。"Form action on the same page"翻译成"在同一页上使用表单操作"。
    <form action="" method="post">
    <table border="1px">
        <tr><td>Name: <input type="text" name="user_name" ></td></tr>
        <tr><td align="right"> <input type="submit" value="submit" name="btn"> 
    </td></tr>
    </table>
    </form>
    
    <?php
      if(isset($_POST['btn'])){
         $name=$_POST['user_name'];
         echo 'Welcome '. $name; 
       }
     ?>
    

    2

    如果涉及到IT技术,只需忽略action属性并在php中使用!empty(非空)即可。

    <form method="post">
            <input type="name" name="name">
            <input type="submit">
        </form>
        <?PHP
           if(!empty($_POST['name']))
           { 
               echo $_POST['name'];
           }
        ?>
    

    2
    您需要使用类似于以下代码的代码:
    echo "<div id='divwithform'>";
    
    if(isset($_POST['submit']))  // if form was submitted (if you came here with form data)
    {
        echo "Success";
    }
    else                // if form was not submitted (if you came here without form data)
    {
        echo "<form> ... </form>";
    } 
    
    echo "</div>";
    

    许多网页都会使用类似于以下代码的 if 语句,但这只是一种非常简化的写法。

    通常情况下,你需要在第一个 "if" 语句中验证一些数据(例如检查表单字段是否为空等等)。

    请访问 www.thenewboston.orgphpacademy.org。这里有非常好的 PHP 视频教程,包括表单相关内容。


    0

    试试这个... 对我有用

    <form action="submit.php" method="post">
    <input type="text" name="input">
    <input type="submit">
    </form>
    

    ------ submit.php ------

    <?php header("Location: ../index.php"); ?>
    

    4
    这将刷新页面。 - Bogdan C
    绝对不能以任何方式实现OP所要求的功能:即在提交表单后,用户仍停留在带有表单的页面上。 - Frank Conijn - Support Ukraine

    0

    我知道这是一个老问题,但由于它在谷歌上排名第一,因此值得更新。

    您不需要使用jQuery或JavaScript来在表单提交后停留在同一页。

    您只需要让PHP返回状态码204(无内容)即可。

    这告诉页面保持原地。当然,您可能还需要一些JavaScript来清空所选文件名。


    正确,但您应该包括读者应在processForm.php中包含的正确和完整代码(在OP的示例中)。 - Frank Conijn - Support Ukraine
    @FrankConijn-SupportUkraine,我很想帮忙,但是我已经有十年没有使用 PHP 了,甚至可能超过两个十年了!我在寻找类似的东西时发现这个问题,注意到其他答案都比较陈旧,提供了不再需要的复杂答案。如果你知道如何使用 PHP 返回 204 状态,请随时更新答案。 - Julian Knight

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接