2

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

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

主页.php

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

打印“您正在注销”的网站

4

1 回答 1

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 成功初始化。对我来说更有意义的是,如果会话启动失败,您会向系统管理员或您自己记录一条消息,表明该站点未正确配置。如果站点配置为会话,会话开始将始终返回 true。
  4. 现在,您可以通过将具有键“admin”的会话变量设置为“login”的值,使其成为超级全局数组 $_SESSION 的元素。
  5. 当您跌破 index.php 的底部(退出它)时,PHP 使用 cookie 中的键(即其他脚本可以找到它的“B2”)将 $_SESSION 数组的当前内容写入数据存储区。存储到数据存储区的会话数据使用键“B2”是 $_SESSION 数组,其中包含单个元素,键为“admin”,值为“login”

当您检查时,您在 home.php 中的代码我相信这是正在发生的事情:

  1. 你做一个 session_start()。因为您之前没有执行 session_name(),所以 PHP 使用 PHPSESSID 的默认名称。PHP 使用会话名称 (PHPSESSID) 的键查找从浏览器发送的 cookie,但没有找到。因此它创建了一个新会话。它为会话生成一个新的随机会话 id,我们称之为“C3”;它将会话数据 ($_SESSION) 初始化为一个空数组,并使用 PHPSESSID 的键和为您的会话(“C3”)创建的随机会话 ID 的值创建一个 cookie。
  2. 您在 if/else 中检查会话数据是否具有键为“admin”的元素。session 数组为空,因此 if else 选择了 false 分支并打印出用户未登录。

由于 index.php 中的“if”,您的代码比这更复杂,但为了简化问题:

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

于 2013-11-03T12:17:45.527 回答