Frameset / PHP теряет переменную сеанса, если щелкнуть внутри фрейма

Я использую фреймы для своего сайта (я не знаю, оптимальный, это планируется изменить в будущем)

Используя навигацию слева, переменные сеанса передаются правильно.

Однако, если я нажму, чтобы открыть новую страницу изнутри фрейма «контент» и заменить его, будет создан новый сеанс.

У меня есть session_start () в начале каждой страницы, а также попытался использовать обходной путь заголовка, однако ничто не решает проблему. Если я загляну в папку sessiondata, то увижу, что после изменения фрейма «content» создается новый сеанс.

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>

0

Решение

<?php
session_start();
if($_SESSION['email']==''){
echo 'please login with your credentials';
} else if($_SESSION['email']!='') {
session_save_path('/var/www/home/path/sessiondata/');
?>

Потратьте некоторое время, чтобы подумать о том, что делает этот код. session_start () означает либо

  • использовать предоставленный токен сеанса для получения данных сеанса из местоположения по умолчанию
  • создайте идентификатор сеанса, затем создайте новый сеанс в местоположении по умолчанию, идентифицированном идентификатором сеанса

В то время как session_save_path () означает, что любые будущие операции чтения или записи применяются к данным сеанса, чтобы перейти в это местоположение, а не по умолчанию.

Следовательно, ваш код никогда не получит аутентифицированный сеанс (так как session_save_path () находится после session_start ()). И, случайно, описанное здесь поведение не может быть создано с помощью кода, который вы нам показали (подразумевается, что другой код в другом месте или в другое время взаимодействовал с данными сеанса).

0

Другие решения

Единственный способ обойти эту проблему — передать идентификатор сеанса в качестве параметра. Странно, что это работает для всех других страниц, вызываемых из левой навигации.

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";

И в соответствующем файле showt.php, который вызывается:

<?php
$sessid= $_REQUEST['sess'];
session_id($sessid);
session_start();·
print_r($_SESSION);
header('P3P: CP="CAO PSA OUR"');
?>
0

По вопросам рекламы [email protected]