单击返回按钮而不是 $_POST 值时读取会话
Posted
技术标签:
【中文标题】单击返回按钮而不是 $_POST 值时读取会话【英文标题】:Read session when click back button instead of $_POST value 【发布时间】:2016-04-15 11:34:58 【问题描述】:我有 3 页,并使用 $_POST
方法传递值。不使用 $_GET
方法的原因是我不希望用户转到 url 并更改值并能够传递值。从头开始为 t2 和 t3 页面:
-
t2 和 t3 将检查
if(isset($_POST))
然后保存到会话中。
当 t3.php 用户点击后退按钮时,t3 不传递$_POST
数据并读取会话
在将数据从 t1 传递到 t2 和 t2 到 t3 时可以工作,但是当单击从 t3 到 t2 的返回按钮时,浏览器显示"Confirm Form Resubmission"
。当用户点击返回按钮时,如何让页面读取会话数据而不是 $_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>
【问题讨论】:
您在发布数据之前检查会话数据? 您可以在 t3.php 上设置一个会话变量,然后检查该变量是否存在于 t2.php 上。如果是这样,用户点击后退按钮,您就可以阅读会话。这是一种选择,如果您不能在使用发布数据之前先直接从会话中读取数据。 @Epodax,是的,因为如果用户键入从 t1 到 t2 的新数据,会话应该存储最新的值 @CharlotteDunois,当页面 t1 到 t2 时,我已经保存了 $_SESSION['t2'] 中的值,为什么我还需要再次存储变量?当用户单击返回按钮时,t2 页面未读取会话,不确定是不是我的代码错误 【参考方案1】:如果您在浏览器中点击“返回”按钮,您的浏览器会尝试重新创建第一次调用该页面时出现的情况/状态。
这意味着,您执行以下操作
1) t1 --> t2 2) t2 --> t3 3) 点击浏览器中的“返回”按钮
现在您的浏览器尝试重新创建情况 1) 以显示页面 t2,并借此重新发布您第一次调用 t2 时发送的数据。
解决此问题的一种方法是始终从会话中加载现有数据并通过 ajax 发布表单,以将下一页的请求和数据的发送分离。如果仅在您从浏览器的角度执行该功能(例如单击绑定到该功能的提交按钮)时发送数据,则调用页面不需要数据。
如果您采用这种方式,您的页面总是会加载存储在您的会话中的数据(并且这是最新的数据)。只有当您通过 ajax 提交数据时,您的会话数据才会更新。
此问题的多个答案中解释了一些选项:jQuery AJAX submit form
我想添加一些代码 sn-p(jQuery/AJAX - 未测试)。它是这样工作的:
单击提交按钮将表单数据发送到 t2.php。 在 t2.php 中检查是否发送了表单数据。如果是,请处理它。 处理调用并发送响应后,第一次调用结束,不加载实际页面。 然后(这里是“成功:...”)t2.php 被加载到浏览器而不发送表单数据。最后一部分是浏览器在打开 t2.php 时执行的操作以及单击后退按钮时执行的操作。代码片段:
// 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>
【讨论】:
我已经尝试改变顺序,首先检查会话,仍然面临同样的错误 if(isset($_SESSION['t2'])) else if(isset($_POST))未设置($_SESSION['t2']); $_SESSION['t2']=$_POST; else header("位置:localhost/my_project/t1.php"); 如果我的想法正确,上面的代码会检查会话变量 t2 中是否已经存储了信息。如果是这样,它不会更新,对吗?如果是这种情况,您将永远无法更新 t2 设置后。我的想法是首先通过 ajax 发送数据以更新会话数据而不加载新页面。成功处理 ajax 调用后,您无需发送数据即可加载新页面。 是的,根据上面的评论,一旦会话获得数据,它将无法更新新记录。但是,即使我在 t2 中这样写,当我从 t3 单击返回按钮时,它仍然显示“确认表单重新提交” 是的,如果为调用该页面完成了表单提交,它将始终如此。您的代码在服务器端运行。但是客户端的浏览器知道它上次调用 t2.php 时发送了数据,并希望再次执行此操作。它不知道服务器端会发生什么,因此它假设正确调用 t2.php 它需要发送一些数据(并且希望重新提交它上次提交的数据)。【参考方案2】:如果您在按下导航器后退按钮时丢失数据,导致页面未加载,您只需在 session_start();
之前添加此 session_cache_limiter('private_no_expire');
,即使您按下后退按钮,页面也会保持原样加载作为另一种方式,您可以使用 get 方法而不是 post 来传递参数,因为第一种方法 session_cache_limiter('private_no_expire');
会产生一些问题
祝你有美好的一天
【讨论】:
以上是关于单击返回按钮而不是 $_POST 值时读取会话的主要内容,如果未能解决你的问题,请参考以下文章
每次我单击自动填充按钮时,它都会在字段中返回“nil”而不是保存的字符串