在php Back Button上显示新数据

时间:2015-01-21 11:44:42

标签: php codeigniter session session-variables

我正在使用CodeIgniter。

我有一个页面(p1),用户输入x-number字段。 然后,数据通过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" />

3 个答案:

答案 0 :(得分:0)

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

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

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 - 在提交时将表单值保存到本地存储中,然后在pageload上重新加载它们:

<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*属性,但这只是一个向您展示的简单示例

答案 1 :(得分:0)

您可以通过关闭缓存强制浏览器获取新内容。 在页面“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

这是no-store指令导致刷新警告显示。您可以删除它,但如果它认为页面内容没有更改,则浏览器仍有可能仍然从缓存中显示。从本质上讲,no-cache并不会真正阻止页面被缓存,如果浏览器认为数据是陈旧的,它只会重新加载页面。你可以先试试no-store指令,看看你是否得到了理想的结果。

答案 2 :(得分:0)

感谢所有试图提供帮助的人,但我发现解决方案有效并且未在此处提出。

最初的问题是,当我从控制器向页面发送数据时,我正在使用POST,每次当我使用后退按钮返回页面时,此POST使用旧值显示,这就是为什么会话值未更新。只有在页面刷新后才会发出新的POST,并看到SESSION覆盖了一些数据。

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

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

希望这有帮助。