会话名称和会话ID更改时,会话未设置

时间:2013-03-04 07:25:52

标签: php session cookies

我想更改会话名称&我的管理员登录面板中的会话ID。 在我的管理面板中,Cookie设置为仅限http

我的问题是会话没有设置。我的代码有任何问题 请帮忙

代码是 的index.php

<?php
session_name("websitename");//session name changed
if (session_start()) {
    session_regenerate_id(true);//session id changed
    //$sess_name=session_name();
    setcookie("websitename", session_id(), null, '/', null, null, true);//set cookie httponly  
}

$_SESSION['admin']="login";
header("Location: home.php");
?>

............................................... ............................................

home.php

<?php
session_start();
if(!isset($_SESSION['admin']))
echo "you are logout";
else
echo "you are in home";
?>

网站打印'您要退出'

1 个答案:

答案 0 :(得分:5)

简短的回答是插入一行:  会话名称( “websitename”); 作为home.php的第一行

为什么呢?对于那些发现自己试图理解PHP中session_name和session_id之间区别的人,我提供了这样的解释:

您的会话数据位于PHP服务器上我称之为“数据存储区”的位置。通常它是一个磁盘文件,但它也可以是一个数据库,具体取决于PHP和应用程序在您的特定服务器上的实现方式(PHP允许应用程序覆盖本机提供的会话存储。

您的会话数据采用“不规则阵列”的形式。

使用每个会话唯一的密钥将不规则数组存储在数据存储区中。

要将会话数据从数据存储区获取到您的php脚本,您必须拥有所需会话的正确密钥。

上面示例代码中index.php中发生的事情是:

  1. 你做一个session_name();这告诉PHP不要使用默认会话名称(PHPSESSID)来访问cookie数据,而是使用网站名称
  2. 你做了session_start(); PHP查找从具有关键“网站”名称的浏览器发送的cookie。它找不到一个,所以它通过生成随机会话ID来创建一个新会话(我们称之为“A1”;它将新会话ID存储在一个cookie中,其键为“websitename”;它将会话数据初始化为一个空数组。(好像你已经完成了$ _SESSION = array();)
  3. 您有一个if语句,您可以在其中检查会话是否已启动。你使用它的方式很奇怪。如果会话确实开始,你重做会话开始刚刚为你做的大部分(除了初始化数组)。在这一点上,让我们假设新的,重新生成的会话id为“B2”。但是,如果会话没有启动,那么你会失败并执行另外两个没有任何意义的语句。如果会话没有开始设置$ _SESSION中的管理密钥是没有意义的,因为重定向到home.php,这取决于index.php成功初始化的会话。对我来说更有意义的是,如果会话启动失败,则会向sysadmin或您自己记录一条消息,表明该站点未正确配置。如果站点配置为会话,则会话启动将始终返回true。
  4. 现在,通过将会话变量设置为超级全局数组$ _SESSION的元素,将键“admin”的会话变量设置为“login”的值。
  5. 当你跌入index.php的底部(退出它)时,PHP使用cookie中的密钥将$ _SESSION数组的当前内容写入数据存储区(即“B2”,其他脚本可以找到存储到数据存储空间键“B2”的会话数据是$ _SESSION数组,其中单个元素的键为“admin”,值为“login”
  6. 当你检查时,你在home.php中的代码我相信这就是发生的事情:

    1. 你做了一个session_start()。因为您没有先前的session_name(),所以PHP使用默认名称PHPSESSID。 PHP使用您的会话名称密钥(PHPSESSID)查找从浏览器发送的cookie,但找不到。所以它创建了一个新的会话。它为会话生成一个新的随机会话ID,我们称之为“C3”;它将会话数据($ _SESSION)初始化为空数组并创建一个cookie,其中包含PHPSESSID键和为会话创建的随机会话ID值(“C3”)。
    2. 你执行if / else,检查会话数据是否有一个键为'admin'的元素。会话数组为空,因此if else选择false分支并打印用户未登录。
    3. 你的代码比这更复杂,因为index.php中的“if”是为了简化问题:

      您使用密钥“B2”将管理员值存储在会话数据存储中,然后使用密钥“C3”在home.php中查找它,但找不到它。这是因为您在index.php中使用会话名称“websitename”,但您在home.php中使用的会话名称为“PHPSESSIONID”。如果您使用chrome开发人员工具的资源选项卡查看cookie,您将看到“websitename”和“PHPSESSIONID”的cookie。在开发人员工具中,cookie将显示真实的,随机的会话ID(26个字符),而不是我为此讨论所做的两个字符会话ID。