我有以下基本的注销脚本,我相信它的功能很奇怪:
<?php
session_start();
$_SESSION['customerState'] = array("abbr"=>"TX","full"=>"Texas");
$_SESSION['agent']['url'] = "jmarston4";
$fart = isset($_SESSION['customerState']) ? $_SESSION['customerState'] : array();
$url = isset($_SESSION['agent']['url']) ? $_SESSION['agent']['url'] : '';
$_SESSION = array();
if (ini_get("session.use_cookies")) {
$params = session_get_cookie_params();
setcookie(session_name(), '', time() - 42000,
$params["path"], $params["domain"],
$params["secure"], $params["httponly"]
);
}
echo "Fart1: ";
print_r($fart);
session_destroy();
echo "<br>Fart2: ";
print_r($fart);
session_start();
echo "<br>Fart3: ";
print_r($fart);
$_SESSION['fart'] = $fart;
echo "<br>Fart4: ";
print_r($_SESSION['fart']);
#exit;
header('Location: https://'. $_SERVER['HTTP_HOST'] . '/' .$url);
此页面使用引荐来源网址(提及为$ url)重定向到网站主页(index.php)。这样可以正常工作。为了测试,这里是index.php上所有代码的屏幕截图:
如果我允许exit;
处理,则会将以下内容输出到屏幕:
Fart1:数组([abbr] =&gt; TX [完整] =&gt;得克萨斯州)
Fart2:数组([abbr] =&gt; TX [完整] =&gt;得克萨斯州)
Fart3:数组([abbr] =&gt; TX [完整] =&gt;得克萨斯州)
Fart4:数组([abbr] =&gt; TX [完整] =&gt;得克萨斯州)
(或视觉上:http://imgur.com/A6WuRfx)
在这个脚本(logout.php)中,我想从客户会话中保留一个SESSION变量(而不是手动取消其他100多个),以便我可以将其传回主页以供内部使用。为此,脚本执行以下操作:
按照设计,PHP SESSIONS是否应该以这种方式运行?如果是这样,那么在保持在该用户会话期间收集的会话信息的同时,如何基本上会破坏会话(例如用于注销目的)。
注意:我正在使用SESSION数组,因此传入用于GET目的的URL不适用于此。
我将此问题的标题改为“PHP会话是否符合规范吗?”
所有这些都适用于脚本本身,但是,当我尝试在主页上访问$ _SESSION ['fart']时,它没有设置。我能够在任何时候在页面上设置,操作或改变SESSION变量,在调用session_destroy()
后包括。例如,如果我想执行以下操作:
... session_destroy()
$ _ SESSION ['eatmyshorts'] =“你好!”;
echo $ _SESSION ['eatmyshorts']; //将显示你好! ....
但是,一旦脚本(页面)结束,与会话相关的任何内容(在这种情况下甚至是$_SESSION['eatmyshorts']
)都无法在任何其他页面上使用并被忽略。
答案 0 :(得分:1)
一旦您致电session_destroy
,会话就会被破坏,会话数据的服务器端存储也会被删除。在此之后操作$_SESSION
变量无效,因为它不再“绑定”到实际会话(即,当脚本结束时,您设置的数据不会写入会话数据存储)。
答案 1 :(得分:1)
如果您致电session_destroy
,请致电stored session data is destroyed, $_SESSION
is emptied, and the ‘session state’ is reset as before session_start
was called。在该状态下,$_SESSION
中的数据仅在运行时存在。现在,如果在session_start
之后调用session_destroy
,则会话处理的行为与运行时中第一个活动会话的行为完全相同:如果客户端请求包含语法上有效的会话ID,则会将其用于此会话。
所有 按预期工作。
但是,您没有考虑的是删除包含ID的会话cookie时会话的行为方式。因为当您发送cookie以撤消客户端的会话ID时,客户端将不会在下一个请求中发送会话ID,session_id
将生成新的会话ID。由于这是一个新会话,$_SESSION
为空。
如果要撤消当前会话ID并生成新会话ID,请使用session_regenerate_id(true)
和session_unset
。
答案 2 :(得分:0)
所有这些都适用于脚本本身 然后你提供的代码没有任何问题(除了缺少session_start(),但你说你把它放进去了 - 你应该编辑上面的代码,因为人们回复它是基于它是一个明显的错误) 我尝试了上面的代码并确认它可以单独使用。
要获得帮助,您应该解释或(理想情况下)显示其余代码,以便对其进行评估,并找出问题的根本原因。
尝试将您的底部代码更改为此并告诉我们结果
echo "Fart1: ".$fart;
session_destroy();
echo "<br>Fart2: ".$fart;
session_start();
echo "<br>Fart3: ".$fart;
$_SESSION['fart'] = $fart;
//header('Location: /'); exit; <-- commented out
echo "<br>session: ".$_SESSION['fart'];
虽然你自己工作了,并且确实session_start()
出现在它重定向到的文件上,并且在任何HTML输出之前位于文件的顶部,同时也尝试重定向到实际的页面名称判处别的东西,即
header('Location: index.php'); exit; //or whatever filename is your homepage
另外要回答关于如何正确执行此操作的其他问题,如何执行此操作很好,因为您将var设置为值,再次启动会话并将$ _SESSION设置为var值。 您可以直接访问$ _SESSION数据,例如
$_SESSION['userlogin']['username'] = 'james';
//log me out from the session =
$_SESSION['userlogin']['username'] = '';