Php 简明教程

PHP - Post-Redirect-Get (PRG)

在 PHP 中,PRG 代表“Post/Redirect/Get”。这是一种常用的技术,设计用于防止提交表单之后再次提交该表单。您可以在 PHP 中轻松实施此技术以避免重复提交表单。

通常,HTML 表单使用 POST 方法向服务器发送数据。服务器脚本获取数据以进行进一步处理,如在后端数据库中添加新记录或运行查询以获取数据。如果用户意外地刷新浏览器,则有可能再次重新提交相同的表单数据,可能导致数据完整性丢失。PHP 中的 PRG 方法帮助您避免这种陷阱。

Example

首先,我们考虑以下 PHP 脚本,它渲染一个简单的 HTML 表单,并使用 POST 方法将其提交回自身。当用户填写数据并提交时,后端脚本会获取数据,渲染结果,然后返回以再次显示空白表单。

<?php
   if (isset($_POST["submit"])) {
      if ($_SERVER["REQUEST_METHOD"] == "POST")
         echo "First name: " . $_REQUEST['first_name'] . " " . "Last Name: " . $_REQUEST['last_name'] . "";
   }
?>

<html>
<body>
   <form action="<?php echo $_SERVER['PHP_SELF'];?>" method="post">
      First Name: <input type="text" name="first_name">  <br/>
      Last Name: <input type="text" name="last_name" />
      <button type="submit" name="submit">Submit</button>
   </form>
</body>
</html>

假设服务器正在运行,则将上述脚本放置在文档根文件夹中并在浏览器中访问。

填写数据并提交。浏览器会回显结果,然后重新渲染表单。现在,如果您尝试刷新浏览器页面,将会弹出一个警告,如下所示 −

php prg 1

如果您按 Continue ,则会再次发布相同数据。

可以使用以下图形理解问题 −

php prg 2

在 PHP 脚本中执行以下步骤以避免问题 −

  1. HTML 表单之前的 PHP 脚本启动一个新会话。

  2. 检查表单是否已用 POST 方法提交。

  3. 如果是,请将表单数据存储到会话变量中

  4. 将浏览器重定向到结果页面。在我们的示例中,即为同一页面。使用 exit 命令停止此脚本,确保不会再执行更多代码。

  5. 如果 PHP 发现请求方法不是 POST,则会检查会话变量是否已设置。如果是,则会与刚复制的表单一同呈现。

  6. 现在,即使刷新了表单,您也已成功避免了重新提交的可能性。

Example

下面是使用 PRG 技术的 PHP 代码−

<?php
   session_start();
   if (isset($_POST["submit"])) {
      $_SESSION['fname'] = $_POST['first_name'];
      $_SESSION['lname'] = $_POST['last_name'];
      header("Location: hello.php");
      exit;
   }
   if (isset($_SESSION["fname"])) {
      echo "First name: " . $_SESSION['fname'] . " " . "Last Name: " . $_SESSION['lname'] . "";
      unset($_SESSION["fname"]); unset($_SESSION["lname"]);
   }
?>

<html>
<body>
   <form action="<?php echo $_SERVER['PHP_SELF'];?>" method="post">
      First Name: <input type="text" name="first_name">  <br />
      Last Name: <input type="text" name="last_name" />
      <button type="submit" name="submit">Submit</button>
   </form>
</body>
</html>