简单的Post-Redirect-获取代码示例

我发现许多描述PRG的网站,但没有简单的PHP代码示例。


这是我实现的:

  1. form.php有一个动作: validate.php
  2. validate.php是用户永远不会看到的; 如果validation所有$_GET并且如果有效写入数据库并生成确认页面的HTML /如果无效,则生成错误页面的HTML,以解释错误。
  3. 无论生成哪个HTML都存储在一个$_SESSIONvariables中,然后validate.php调用header('Location: <as appropriate>);
  4. invalid_input.phpsubmitted.php invalid_input.php (用户读取URL的情况下)只包含echo $_SESSION['form_html'];

在我看来,像保护页面重新加载和后退button问题。

我是否试图重新发明轮子?

最简单的情况:

 if ($_POST) { // Execute code (such as database updates) here. // Redirect to this page. header("Location: " . $_SERVER['REQUEST_URI']); exit(); } 

使用REQUEST_URI 。 不要在大多数CMS系统中使用PHP_SELF框架将引用/index.php

一段代码:

 if (count($_POST)) { // process the POST data // your code here- so for example to log a user in, register a new account.. // ...make a payment...etc // redirect to the same page without the POST data, including any GET info you // want, you could add a clause to detect whether processing the post data has // been successful or not, depending on your needs $get_info = "?status=success"; // if not using rewrite // header("Location: ".$_SERVER['PHP_SELF'].$get_info); // if using apache rewrite header("Location: ".$_SERVER['REQUEST_URI'].$get_info); exit(); } 
  Browser HTML form method=POST | v PHP app reads $_POST sends 303 header | v Browser receives header redirected to new page | v PHP app reads $_GET does whatever 

常用的是loginauthentication。 这是用户提交login表单时的stream程。 PHP应用程序通过$ _POST varsvalidation用户。 用户成功通过身份validation后,将303头返回给浏览器。 所以用户被redirect到一个新的页面。

Caller.htm

 <form method="post" action="Callee.php?Query1"> <input type="text" name="PostData" /> <input type="submit" value="Go" /> </form> 

Callee.php (被称为两次。)

 if ($_POST) { header("Location: ". $_SERVER['REQUEST_URI']. 'Query2'); // PART1: Use $_POST and $_GET to execute database updates here... // Now any display (ie echo or print) will come after the header. // ... die; // When done, GET 'myself' to execute PART2 below. } // PART2: Results page goes here... echo 'PART 2 display output: '; var_dump($_GET); 

注意有两个查询string参与

看看var_dump说的$ _GET:

 PART 2 display output: array(1) { ["Query1Query2"]=> string(0) "" } 

将POST部分放在POST部分末尾的问题如下所示:

 header("Location: ". $_SERVER['REQUEST_URI']. 'Query2'); die; 

php手册中提到:“记住header()必须在发送任何实际的输出之前被调用,通过普通的HTML标签,文件中的空行或者PHP来发送,这是使用include读取代码的一个非常常见的错误,要求,函数或其他文件访问函数,并且在调用header()之前输出空格或空行,使用单个PHP / HTML文件时也存在同样的问题。

但是,如果您需要根据POST部分中发生的情况构build“Query2”,则可能需要位于POST部分的底部。 这是可以的,只要你不尝试在它上面插入任何回声,甚至不用于testing。

我想向您介绍一种经常在更大规模和更详细的框架中使用的方法。

我们要做什么

我们有一个名为index.php的文件。

  • 我们将要提交一个表格
  • 我们将要检查这个提交
  • 我们将把POST数据添加到会话中
  • 我们将把用户redirect到确认页面
  • 我们将显示数据并让用户确认。
  • 我们将提交并最终处理数据。
  • 我们将redirect到index.php并显示通知。

代码

 <?php if (!isset($_SESSION)) session_start(); if ($_SERVER['REQUEST_METHOD'] == 'POST') { switch ($_POST['submit']) { case 'add': // This is where our first POST will end up // We can perform actions such as checking the data here // After that we will add the POST data to a session $_SESSION['postdata'] = $_POST; // and unset the $_POST afterwards, to prevent refreshes from resubmitting. unset($_POST); // Now we will redirect... header("Location: ".$_SERVER['PHP_SELF']); break; case 'confirm': // We can now insert the data into the database or email it // Then we will unset the session and redirect back unset($_SESSION['postdata']); // This is to display our notification $_SESSION['success'] = true; // And there we go again... header("Location: ".$_SERVER['PHP_SELF']); break; } // We will exit here because we don't want the script to execute any further. exit; } ?> <?php if (isset($_SESSION['success']) && $_SESSION['success'] == true): ?> <p>Our data has been processed succesfully</p> <?php unset($_SESSION['success']); ?> <?php endif; ?> <?php if (isset($_SESSION['postdata'])): ?> <p> You want to add the following data:<br /> <pre><?php print_r($_SESSION['postdata']); ?></pre> Is this correct?<br /> <form method="POST" action="<?= $_SERVER['PHP_SELF']; ?>"> <button type="submit" value="confirm">Yes</button> </form> </p> <?php else: ?> <p> <form method="POST" action="<?= $_SERVER['PHP_SELF']; ?>"> <input type="text" name="..."><br /> <input type="text" name="..."><br /> <input type="text" name="..."><br /> <input type="text" name="..."><br /> <button type="submit" value="add">Add something</button> </form> </p> <?php endif; ?>