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

2 php cookies session

我想在管理员登录面板中更改会话名称和会话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");
?>
Run Code Online (Sandbox Code Playgroud)

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

home.php

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

网站打印'你要注销'

Ted*_*hen 5

简短的回答是插入行:session_name("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",其他脚本可以找到它.存储到数据存储区的会话数据usng键"B2"是$ _SESSION数组,其中单个元素的键为"admin",值为"login"

当你检查时,你在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分支并打印用户未登录的内容.

你的代码比这更复杂,因为index.php中的"if"是为了简化问题:

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