在 php 后退按钮上显示新数据


Display new data on php Back Button

我正在使用CodeIgniter。

我有一个页面 (p1),用户在其中输入 x 个字段。然后,数据通过post发送到控制器,存储在会话中,然后将用户发送到另一个页面(p2)。

用户填写 p2

上的数据后,p1 和 p2 中的所有数据都保存在数据库中,并创建一个新对象。

p1

的内容是可编辑的,因此当其帐户中的用户选择编辑页面时,他将被发送到 p1,并填写所有字段。他编辑字段,然后转到 p2,但随后单击后退按钮,因为他忘记了一些字段,当他被重定向回 p1 时,值与他刚刚从他的帐户进入页面(旧值)相同。

但是,如果我单击后退按钮,然后刷新页面,则会正确显示会话的值。我能以某种方式克服这一点吗?

在我的 php 文档中,我使用以下逻辑:

// pass data to p1 from controller as an array
// I check if an object has been passed to the page, if yes, assign values, meaning it is editing. Else, it is a new object
<?php if(isset($objects) && is_array($objects)){ 
         foreach ($objects as $key => $value){
              $id = $value -> id;
              $title = $value -> title; 
      ... } ?>
//Then I do a check - if session values for title exist, then that means user is coming back from the next page, so use session values
<?php if($this->session->userdata('title') != "-1" && $this->session->userdata('title') != "" || $this->session->userdata('title')){
      $id =$this->session->userdata('title');
      $title = $this->session->userdata('title');
...    }
//Then I display the values to the user
<input type="text" value="<?php echo $title; ?>" name="title" id="title" />

您可以通过关闭缓存来强制浏览器获取新内容。在页面"A"上设置这些 PHP 标头以防止缓存并强制页面重新加载:

header("Cache-Control: no-cache, no-store, must-revalidate"); //HTTP 1.1
header("Pragma: no-cache"); //HTTP 1.0 older browsers
header("Expires: Mon, 01 Jan 1990 05:00:00 GMT"); // Set a date in the past

潜在的缺点是浏览器将向用户显示一条消息,指出数据需要刷新,要求用户单击以接受以继续。您可以在此处阅读有关缓存的一般内容以及警告标头的更多信息:http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html#sec13。

它是导致显示刷新警告的无存储指令。您可以删除它,但是如果浏览器认为页面内容未更改,则浏览器仍有可能从缓存中显示。从本质上讲,无缓存并不能真正阻止页面被缓存,它只是在浏览器认为数据过时努力重新加载页面。您可以先尝试不使用无商店指令,看看是否获得所需的结果。

当按下后退按钮时,默认情况下浏览器会从缓存中加载页面(这就是为什么它如此之快)。

如果您希望从服务器重新加载页面(以便显示新的会话变量),则需要设置无缓存标头:

header("Cache-Control: no-store, must-revalidate, max-age=0");
header("Pragma: no-cache");

我不是普通的CodeIgnitor用户,但我相信在CI中执行此操作的正确方法是在控制器中使用$this->output->set_header();

https://ellislab.com/codeigniter/user-guide/libraries/output.html

如果做不到这一点,您可以使用一些javascript - 在提交时将表单值保存到本地存储中,然后在页面加载时重新加载它们:

<body onload="pageLoad();">
<form action="http://www.google.com" onsubmit="savedata(this);">
    <input type="text" name="fname" id="fname" value="default"/>
    <button type="submit"> submit</button>
</form>
<script>
    function savedata(form){
        localStorage.setItem('fname', form.fname);
        return true;
    }
    function pageLoad(){
        if(localStorage.getItem('fname')){
            document.getElementById('fname').value = localStorage.getItem('fname');
        }
    }
</script>
</body>
</html>

您应该使用事件侦听器而不是内联on*属性,但这只是一个快速示例,

向您展示

感谢所有试图提供帮助的人,但我找到了有效的解决方案,这里没有建议。

最初的问题是,当我从控制器将数据发送到页面时,我使用的是 POST,并且每次当我使用后退按钮返回页面时,此 POST 都会使用旧值来显示,这就是会话值没有更新的原因。只有在页面刷新后,才会有新的 POST 通过并看到 SESSION 覆盖了一些数据。

简单的刷新(通过 php 或 js)无法解决问题,因为它会执行强制刷新,这会自动拒绝从上一页发送的 POST,说它根本没有数据进入。

解决方案不是向页面发送 POST,而是使用重定向到 p1,并在导航之前将所有会话值设置为您需要的任何值。然后,当您导航到 p2 并单击返回时,如果您的会话值已更新,则更新将立即生效。

希望这有帮助。