Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/233.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在php上显示新数据返回按钮_Php_Codeigniter_Session_Session Variables - Fatal编程技术网

在php上显示新数据返回按钮

在php上显示新数据返回按钮,php,codeigniter,session,session-variables,Php,Codeigniter,Session,Session Variables,我正在使用CodeIgniter 我有一个页面(p1),用户在其中输入x个字段。 然后,数据通过post发送到控制器,并存储在会话中,然后用户被发送到另一个页面(p2) 用户填写p2上的数据后,p1和p2中的所有数据都保存在数据库中,并创建一个新对象 p1的内容是可编辑的,因此当用户从其帐户选择编辑页面时,他将被发送到p1并填写所有字段。他编辑字段,然后转到p2,但随后单击“上一步”按钮,因为他忘记了一些字段,当他被重定向回p1时,这些值与他刚从帐户进入页面时的值相同(旧值) 但是,如果单击“上

我正在使用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" />
//将数据作为数组从控制器传递到p1
//我检查对象是否已传递到页面,如果是,则指定值,这意味着它正在编辑。否则,它就是一个新对象
//然后我做一个检查-如果标题的会话值存在,那么这意味着用户将从下一页返回,所以使用会话值

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

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

header("Cache-Control: no-store, must-revalidate, max-age=0");
header("Pragma: no-cache");
我不是一个普通的CodeIgnitor用户,但我相信在CI中这样做的正确方法是使用
$this->output->set_header()在控制器中:

否则,您可以使用一些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>

提交
函数savedata(表单){
setItem('fname',form.fname);
返回true;
}
函数pageLoad(){
if(localStorage.getItem('fname')){
document.getElementById('fname')。value=localStorage.getItem('fname');
}
}

您应该在*
属性上使用事件侦听器,而不是内联
,但这只是一个简单的示例,向您展示了可以通过关闭缓存强制浏览器获取新内容。
在页面“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
潜在的缺点是浏览器将向用户显示一条消息,要求用户单击“接受”以继续刷新数据。您可以在此处阅读有关缓存和警告标题的更多信息:


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

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

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

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

解决方案不是向页面发送帖子,而是使用重定向到p1,然后再导航,将所有会话值设置为所需的值。然后,当导航到p2并单击“上一步”时,如果会话值已更新,则更新将立即生效


希望这有帮助

我以前确实尝试过这种方法,尽管它有效,但警告是可怕的。这会吓到用户,而不是继续,我担心他只会关闭页面。还有其他选择吗?这看起来可能对你有用。该示例有一些ASP代码,但您可以轻松地将其转换为PHP。您还需要将ALERT()改为调用页面重新加载。但这如何解决我的问题呢?我会知道我的页面已经返回。p1仍然不知道,所以它会显示旧数据。你读了整篇文章了吗?在最后的it讨论中,设置会话变量并在导航回的页面上检查这些变量。在讨论警报代码时,我可能把你弄糊涂了。我不该提那件事。我的错。把这篇文章读到最后。我试着把这些标题放进去:$this->output->set_标题(“Expires:Tue,01 Jan 2000 00:00:00 GMT”);$this->output->set_标题(“上次修改:.gmdate(“D,dmy H:i:s”)“GMT”);$this->output->set_头(“缓存控制:无存储,无缓存,必须重新验证,最大年龄=0”);$this->output->set_头(“缓存控制:后检查=0,预检查=0”,false);$this->output->set_头(“Pragma:no cache”);缓存警告出现了,这是最初的解决方案。问题是JS有时会失败,结果不一致。