我有3页,并使用$ _POST方法传递值。不使用$ _GET方法的原因是我不希望用户转到网址并更改值并能够传递值。从t2和t3页开始:
在将数据从t1传递到t2和t2到t3时能够工作,但是当从t3到t2点击后退按钮时,浏览器显示"确认表单重新提交"。当用户点击后退按钮时,如何让页面读取会话数据而不是$ _POST值?
t1.php
<html>
<body>
<form id="b">
value1: <input type="text" name="value1" id="value1">
value2: <input type="text" name="value2" id="value2">
<input type="button" onclick ="test()" value="test">
</form>
</body>
</html>
<script type="text/javascript">
function test(){
document.getElementById("b").method = "post";
document.getElementById("b").action = "t2.php";
document.getElementById("value1").value = "asd";
document.getElementById("value2").value = "zxc";
document.getElementById('b').submit();
}
</script>
t2.php
<?php
session_start();
if(isset($_POST)){
unset($_SESSION['t2']);
$_SESSION['t2']=$_POST;
}else if(isset($_SESSION['t2'])){
}else{
header("Location: http://localhost/my_project/t1.php");
}
?>
<html>
<body>
value1<?php echo $_SESSION['t2']["value1"]; ?>!<br>
value2 <?php echo $_SESSION['t2']["value2"]; ?>.
<form id="b">
value1: <input type="text" name="value1" id="value1">
value2: <input type="text" name="value2" id="value12">
<input type="button" onclick ="test()" value="test">
</form>
</body>
</html>
<script type="text/javascript">
function test(){
document.getElementById("b").method = "post";
document.getElementById("b").action = "t3.php";
document.getElementById("value1").value = "qwe";
document.getElementById("value2").value = "rty";
document.getElementById('b').submit();
}
</script>
t3.php
<?php
session_start();
if(isset($_POST)){
unset($_SESSION['t3']);
$_SESSION['t3']=$_POST;
}else if(isset($_SESSION['t3'])){
}else{
header("Location: http://localhost/my_project/t1.php");
}
?>
<html>
<body>
value1<?php echo $_SESSION['t3']["value1"]; ?>!<br>
value2 <?php echo $_SESSION['t3']["value2"]; ?>.
</body>
</html>
答案 0 :(得分:1)
如果您点击浏览器中的“后退”按钮,浏览器会尝试重新创建首次调用该页面时出现的情况/状态。
这意味着,您执行以下操作
1)t1 - &gt; T2
2)t2 - &gt; T3
3)点击浏览器中的“后退”按钮
现在您的浏览器尝试重新创建情境1)以显示第t2页,并且这样想重新发布您第一次调用t2时发送的数据。
解决此问题的一种方法是始终从会话中加载现有数据,并通过ajax发布表单以解耦下一页的请求和发送数据。如果在执行该功能时仅发送数据(例如,单击绑定到该功能的提交按钮),则从浏览器的角度来看,没有数据需要调用该页面。
如果按照这种方式进行操作,您的页面就会加载存储在会话中的数据(这是最新的数据)。只有通过ajax提交数据时,您的会话数据才会更新。
此问题的多个答案中解释了一些选项:jQuery AJAX submit form
我想添加一些代码片段(jQuery / AJAX - 未经过测试)。它的工作原理如下:
代码段:
// You can also reference the jQuery library differently than this:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js">
// Will bind the function, once the page is loaded
$(document).ready(funtion(){
// Gets a reference to your form
var $form = $('#yourFormId');
// Gets the target URL of your form
var formURL = form.attr("action");
// Will be execured when you click the submit button
$form.submit(funtion(e){
// Does stop the form from submitting data itself
e.preventDefault();
// Call to send data
$.ajax({
type: "POST",
url: formURL,
data: $(this).serialize(),
cache: false,
success: function() { window.location.href = formURL; }
});
});
});
</script>
答案 1 :(得分:1)
如果您在按导航器后退按钮时丢失了数据,结果页面未加载,则只需在session_cache_limiter('private_no_expire');
之前添加此session_start();
,这将使页面保持原样,即使您按下后退按钮,作为另一种方式,您可以使用get方法而不是post来传递参数,因为第一种方法session_cache_limiter('private_no_expire');
会产生一些问题
祝你愉快