PHP - POST/重定向/GET (PRG)



在PHP中,PRG代表“POST/重定向/GET”。這是一種常用的技術,旨在防止表單在提交後再次提交。您可以輕鬆地在PHP中實現此技術以避免重複提交表單。

通常,HTML表單使用POST方法向伺服器傳送資料。伺服器指令碼獲取資料以進行進一步處理,例如在後端資料庫中新增新記錄或執行查詢以獲取資料。如果使用者意外重新整理瀏覽器,則有可能再次提交相同的表單資料,這可能會導致資料完整性丟失。PHP中的PRG方法可以幫助您避免此陷阱。

示例

首先,讓我們考慮以下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

如果您按**繼續**,則會再次釋出相同的資料。

可以使用下圖瞭解此問題:

PHP PRG 2

PHP指令碼中採取了以下步驟來避免此問題:

  • HTML表單之前的PHP指令碼啟動一個新的會話。

  • 檢查表單是否已使用POST方法提交。

  • 如果是,則將表單資料儲存在會話變數中。

  • 將瀏覽器重定向到結果頁面。在我們的例子中,它是同一頁面。使用exit命令終止此指令碼,以確保不再執行任何程式碼。

  • 如果PHP發現REQUEST方法不是POST,則它會檢查會話變數是否已設定。如果是,則它們會與新表單副本一起呈現。

  • 現在,即使重新整理表單,您也已成功避免了再次提交的可能性。

示例

以下是使用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>
廣告
© . All rights reserved.