如果在框架内单击,Frameset/PHP将丢失会话变量

如果在框架内单击,Frameset/PHP将丢失会话变量,php,session,frames,Php,Session,Frames,我正在为我的站点使用框架(我知道不是最优的,计划在将来更改) 使用左侧的导航,可以正确传递会话变量 但是,如果我单击从“内容”框架内打开一个新页面并替换它,则会创建一个新会话 我在每一页的开头都有session_start(),并且尝试了使用页眉变通方法,但是没有任何方法可以解决这个问题。如果我查看sessiondata文件夹,我会看到在更改“内容”框架后,会创建一个新会话 if(!isset($_SESSION)) { session_start();· } header('P3P: CP=

我正在为我的站点使用框架(我知道不是最优的,计划在将来更改)

使用左侧的导航,可以正确传递会话变量

但是,如果我单击从“内容”框架内打开一个新页面并替换它,则会创建一个新会话

我在每一页的开头都有session_start(),并且尝试了使用页眉变通方法,但是没有任何方法可以解决这个问题。如果我查看sessiondata文件夹,我会看到在更改“内容”框架后,会创建一个新会话

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标识的默认位置创建新会话
而session_save_path()表示将来应用于会话数据的任何读写操作都将转到该位置,而不是默认位置


因此,您的代码永远不会检索经过身份验证的会话(因为会话\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"');
?>