我网站上的主页有一个包含两个字段的表单:Make of the Car(carmake)和Car Model(carmodel)。提交后,它会将用户带到第二页,显示有关用户在主页上输入的特定品牌和型号的信息。
我正在使用post-method将变量传递给第二页,在那里我用两个变量开始一个新的会话:
<?php
session_start();
$_SESSION['carmake']=$_POST['carmake'];
$_SESSION['carmodel']=$_POST['carmodel'];
?>
这很好用。在第2页,我有一个第3页的链接,它使用相同的两个会话变量。因此,在第3页,我使用会话功能启动页面,并且会话变量可供使用。到目前为止没问题。
从这一点开始,我遇到了两个问题:
问题1:我在第3页上有一个链接回第2页的按钮。当我使用此按钮返回第2页时,第2页不会回显会话变量。但是,如果我使用浏览器&#39;返回&#39;按钮返回第2页,我被要求&#34;确认重新提交&#34;我做了,然后第二页正确回应会话变量。
我的问题1:如何在不丢失会话变量的情况下设计导航到以前访问过的页面?
问题2:有没有办法避免必须&#34;确认重新提交&#34; (在使用浏览器后退按钮时)在以前访问过的使用会话变量的页面上?
(我是这里的新手,并提前为长篇文章道歉,这可能是一个非常简单的问题。)
答案 0 :(得分:6)
更改您的代码
<?php
session_start();
$_SESSION['carmake']=$_POST['carmake'];
$_SESSION['carmodel']=$_POST['carmodel'];
要
<?php
session_start();
if(isset($_POST['carmake']))
$_SESSION['carmake']=$_POST['carmake'];
if(isset($_POST['carmodel']))
$_SESSION['carmodel']=$_POST['carmodel'];
只有在提交表单(从Form1提交)时才会设置会话值,因此当您单击“返回”按钮时,它将不会设置空白值并保持上一个会话值保持不变)
<?php
session_start();
if(isset($_POST['carmake']))
$_SESSION['carmake']=$_POST['carmake'];
if(isset($_POST['carmodel']))
$_SESSION['carmodel']=$_POST['carmodel'];
if(isset($_POST['carmake']) || isset($_POST['carmodel'])){
# Redirect on same page when submitting the form
# will not ask for form submission when click back on browser page
header("Location: page2.php")
exit;
}
答案 1 :(得分:1)
问题1:除非您在分配之前检查$ _POST是否具有值,否则会话将获得空值。打开更高的错误日志级别并显示错误,您应该看到有关未定义变量的通知。此外,当您确认提交时,它会起作用,因为您正在将数据重新发布到第二页。
问题1:在分配之前检查POST变量是否为空()。
问题2:并非我知道,您将返回浏览器之前发布过的页面,并且想知道您是否想再次(以获得与之前“相同”的结果)
更新:此外,您应该发布更多代码。
答案 2 :(得分:0)
我知道我迟到了,但只想分享我的解决方案。我希望这有助于某人。
仅在提交表单时将值存储在会话中。
<?php
session_start();
if(isset($_POST['carmake'])) $_SESSION['carmake'] = $_POST['carmake'];
if(isset($_POST['carmodel'])) $_SESSION['carmodel'] = $_POST['carmodel'];
/* Rest of the code goes here */
使用浏览器后退按钮时,缓存控制和会话缓存限制器会阻止表单重新提交。
<?php
session_start();
header("Cache-Control: no cache");
session_cache_limiter("private_no_expire");
/* Rest of the code goes here */
<?php
session_start();
header("Cache-Control: no cache");
session_cache_limiter("private_no_expire");
if(isset($_POST['carmake'])) $_SESSION['carmake']=$_POST['carmake'];
if(isset($_POST['carmodel'])) $_SESSION['carmodel']=$_POST['carmodel'];
/* Rest of the code goes here */