【问题标题】:PHP Form Post/Redirect/Get Header Location ErrorPHP 表单发布/重定向/获取标题位置错误
【发布时间】:2017-09-10 17:40:14
【问题描述】:

我制作了一个简单的表格来帮助我学习 php。我正在使用我的本地主机服务器来托管 php 文件 (form.php)。但是,当我刷新页面时它会重新提交表单,我知道我可以使用 post/redirect/get 方法来解决这个问题。除了实现 header('Location: form.php');一直没有工作,如果您可以查看代码并告诉我我做错了什么,那将不胜感激。

代码示例,即没有 header('Location: form.php');

<?php 
if (empty($_POST) === false) {
    echo '<pre>', print_r($_POST, true), '</pre>';
    }
?>

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Form</title>
  </head>
<body>

<form action="form.php" method="post">
  <p>
    <label for="name">Name:</label><br>
    <input type="text" name="name" id="name"><br>
  </p>
  <p>
    <label for="email">Email:</label><br>
    <input type="text" name="email" id="email"><br>
  </p>
  <p>
    <label for="message">Message:</label><br>
    <textarea name="message" id="message"></textarea>
  </p>
  <p>
    <input type="submit" value="submit">
  </p>
</form>

这是结果...

没有标题位置的屏幕截图

然后我补充:

header('Location: form.php');

我明白了……

【问题讨论】:

  • 重定向代码在哪里以及您将其放置在哪里?屏幕截图无助于找出问题。
  • 似乎您正在将页面重定向到自身。
  • 它需要你的form.php文件的完整路径
  • 告诉我们你在哪里添加了header()-call。我们需要查看无法为您提供帮助的代码。

标签: php html forms post-redirect-get


【解决方案1】:

为了防止表单在页面刷新时重新提交,使用了两种方法:

方法一:使用 AJAX + 重定向

使用 AJAX 提交表单,然后使用 JQuery 重定向到另一个页面。

方法二:重新加载页面

使用 Javascript 刷新页面。

你的代码应该是这样的:

    <?php 
        if (!empty($_POST)) {
            echo '<pre>', print_r($_POST, true), '</pre>';
            echo '<script type="text/javascript"> location.reload();</script>';
        }
    ?>

    <!DOCTYPE html>
    <html>
       <head>
         <meta charset="utf-8">
         <title>Form</title>
       </head>
       <body>

        <form action="form.php" method="post">
          <p>
            <label for="name">Name:</label><br>
            <input type="text" name="name" id="name"><br>
          </p>
          <p>
            <label for="email">Email:</label><br>
            <input type="text" name="email" id="email"><br>
          </p>
          <p>
            <label for="message">Message:</label><br>
            <textarea name="message" id="message"></textarea>
          </p>
          <p>
            <input type="submit" value="submit">
          </p>
        </form>
       </body>
    </html>

【讨论】:

  • 您的代码示例将失败,因为您在 header()-call 之前输出内容。所有标头都必须在 任何其他输出之前调用,否则您将得到“标头已发送”。您还应该在标头调用之后有一个 exit; 以阻止解析器继续执行脚本。
  • 你是对的。我刚刚编辑了我的答案。谢谢你:)
  • 清空 POST 数组是不必要的,也是不好的做法。如果您想查看脚本稍后发布的内容怎么办?这将如何防止海报的问题?
  • 实际上,新的答案也不正确。当您刷新发布请求时,将再次发送相同的请求(它是记住该请求的浏览器)。 $_POST-array 只是一个用 copy 帖子数据填充的数组。这不是 实际 发布请求。
  • 我刚试过,没有雪茄。当您在页面上点击“刷新”时,它仍然要求重新提交表单。 $_POST-array 仍然只是发布数据的副本。更改不会更改浏览器历史记录
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-27
  • 2012-09-04
  • 2018-08-03
相关资源
最近更新 更多