如果在框架内单击,Frameset/PHP将丢失会话变量
我正在为我的站点使用框架(我知道不是最优的,计划在将来更改) 使用左侧的导航,可以正确传递会话变量 但是,如果我单击从“内容”框架内打开一个新页面并替换它,则会创建一个新会话 我在每一页的开头都有session_start(),并且尝试了使用页眉变通方法,但是没有任何方法可以解决这个问题。如果我查看sessiondata文件夹,我会看到在更改“内容”框架后,会创建一个新会话如果在框架内单击,Frameset/PHP将丢失会话变量,php,session,frames,Php,Session,Frames,我正在为我的站点使用框架(我知道不是最优的,计划在将来更改) 使用左侧的导航,可以正确传递会话变量 但是,如果我单击从“内容”框架内打开一个新页面并替换它,则会创建一个新会话 我在每一页的开头都有session_start(),并且尝试了使用页眉变通方法,但是没有任何方法可以解决这个问题。如果我查看sessiondata文件夹,我会看到在更改“内容”框架后,会创建一个新会话 if(!isset($_SESSION)) { session_start();· } header('P3P: CP=
if(!isset($_SESSION)) {
session_start();·
}
header('P3P: CP="CAO PSA OUR"');
--框架集:
<?php session_start();
if($_SESSION['email']==''){echo 'please login with your credentials';}else if($_SESSION['email']!='') {
session_save_path('/var/www/home/path/sessiondata/');
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Website Name.</title>
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Cache-Control" content="no-cache">
<link rel="SHORTCUT ICON" href="http://domain.com/favico.ico" type="image/x-icon">
</head>
<frameset rows="11%,89%" frameborder="1" framespacing="1" topmargin="0" leftmargin="0" marginheight="0" marginwidth="0" border="0" bordercolor="#ffffff">
<frame name="bar" src="report/index1.php" frameborder="0" noresize="noresize" scrolling="no">
<frameset id="mainset" cols="137,5,*" frameborder="0" framespacing="1" topmargin="0" leftmargin="0" marginheight="0" marginwidth="0" border="0" bordercolor="#ffffff">
<frame name="menu" src="report/index_002.php" frameborder="0" noresize="noresize">
<frame name="function" src="report/index_003.php" frameborder="0" scrolling="no" marginwidth="0" marginheight="0" border="0" framespacing="0" noresize="noresize">
<frame name="content" src="report/index_004.php" frameborder="0" noresize="noresize">
</frameset>
<noframes><body><p>This page uses frames, but your browser doesn't support them.</p></body></noframes>
</frameset>
</html>
网站名称。
此页面使用框架,但您的浏览器不支持它们
花点时间思考一下这段代码在做什么。session_start()表示
- 使用提供的会话令牌从默认位置检索会话数据
- 创建会话id,然后在会话id标识的默认位置创建新会话
因此,您的代码永远不会检索经过身份验证的会话(因为会话\u save\u path()在会话\u start()之后)。而且,巧合的是,您在这里描述的行为不能由您向我们展示的代码创建(这意味着其他地方或其他时间的不同代码与会话数据进行了交互)。解决此问题的唯一方法是当前将会话id作为参数传递。奇怪的是,它适用于从左侧导航调用的所有其他页面
echo "<TD align='center'> <a href='http://domain.com/path/report/showt.php?option=$data&id=$iid&sess=$sessid' target='content'> Detail of $data</a></TD>\n";
echo“\n”;
并在相应的文件showt.php中调用:
<?php
$sessid= $_REQUEST['sess'];
session_id($sessid);
session_start();·
print_r($_SESSION);
header('P3P: CP="CAO PSA OUR"');
?>
为什么要使用session_save_path('/var/www/home/path/sessiondata/')?大家好,如果目录不可写,建议将其作为会话数据丢失的来源之一。路径/var/www/home/path/sessiondata/可由www数据访问,在php.ini中指定,并且位于网页路径中,不是外部目录。session_start()不应为conditionalflx,我已尝试使session_start()不带该条件。尽管如此,行为没有改变。My php.ini也使用session.save_path=“/var/www/home/path/sessiondata”,因此这应该是默认值。如果注释掉会话保存路径,行为仍然相同。
<?php
$sessid= $_REQUEST['sess'];
session_id($sessid);
session_start();·
print_r($_SESSION);
header('P3P: CP="CAO PSA OUR"');
?>