2

相关:会话变量未结转

问题

当我从一个页面导航到另一个页面时,任何 $_SESSION[""] 变量都会丢失,尽管我session_start();在尝试访问它们之前正在使用它们。

似乎session_start()它将自动启动一个新会话,除非将 asession_name()或 asession_id()传递给它以指定要恢复的会话。

因此,当需要从服务器端显示/隐藏按钮时,按钮永远不会显示,尽管经过验证的用户之前已经过身份验证。

我在几篇文章中读到了可以解决问题的文章setcookie()

编辑

我必须为会话 ID 手动设置 cookie,如下所述:

Can I restore a PHP SESSION by its ID?

代码示例

login.php

<?php
require_once "logout.php";
require_once "../data/data_access.php";

$sid = session_id();
if (empty($sid)) session_start(); 

$userName = "";
$password = "";

if (isSet($_REQUEST["userName"])) $userName = $_REQUEST["userName"];
if (isSet($_REQUEST["password"])) $password = $_REQUEST["password"];

echo login($userName, $password);

function login($login, $pass) {
    if (isAuthenticUser($userName, $password)) {
        session_regenerate_id(true);
        $_SESSION["authenticated"] = true;
        setcookie("cookie_name", session_id(), time() + 1200);
    } else $_SESSION["authenticated"] = false;

    return $_SESSION["authenticated"];
}

another_file.php

<?php
$sid = session_id();
if (empty($sid)) session_start($_COOKIE["cookie_name"]); // Will this make it?
?>

通过检索会话 id 就足够了,$_COOKIE["cookie_name"]还是我应该做其他事情以便能够继承我的会话变量值?

更新

经过更深入的挖掘,我发现在正常情况下,不需要使用 cookie 来恢复会话,因为 PHP 通过 PHPSESSID cookie 自动完成,我不必关心。

但是,我使用 jQuery$.post()$.ajax()函数与 PHP 服务器进行通信,因此它不能像往常一样使用 URL 自动获取/发布 SID。

考虑到这一点,我设法找到了一种手动使用 cookie 的方法,因此我不会将会话和 cookie 与另一个 SO 用户提到的会话和 cookie 混为一谈:

PHP 会话未从 Cookie 恢复

更新#2

根据我收到的答案,我已经验证了 PHP.ini 配置文件以查看是否启用了 cookie 等。

这里是:

session.save_path = "c:/wamp/tmp"
session.use_cookies = 1
session.use_only_cookies = 1
session.name = PHPSESSID
session.auto_start = 0
session.cookie_lifetime = 0
session.cookie_path = /
session.cookie_domain =
session.cookie_httponly = 
session.serialize_handler = php
session.gc_probability = 1
session.gc_divisor = 100
session.gc_maxlifetime = 1440

饼干和会话就是这样!尽管这种配置在大多数情况下都可以完美运行,但它不起作用。该session_start()函数总是从一个新会话开始。最好的例子是当我转到一个session_start()已调用 a 并且我无法访问我的$_SESSION["authenticated"].

4

2 回答 2

2

如果你想使用 Session,你不需要创建 Cookie,因为它是由 php 创建的,就像你说的那样。

为了在每个 php 页面的开头使用 session 放置session_start()

如果要更改 PHP 会话创建的 cookie 名称,请使用session_name("CookieName")

//Sample Php Page
<?php
session_name("eNGiT");
session_start();
/*Do your Session Based Stuff Below using $_SESSION variable*/
?>
于 2013-10-08T11:02:01.670 回答
2

使用 session 时不需要设置 cookie 名称。php 处理会话所需的一切。php 设置名称为 PHPSESSION 的 cookie 并使用 cookie 处理会话 id。你的项目应该是这样的。

登录.php

<?php
session_start(); 

require_once "logout.php";
require_once "../data/data_access.php";



$userName = "";
$password = "";

if (isSet($_REQUEST["userName"])) $userName = $_REQUEST["userName"];
if (isSet($_REQUEST["password"])) $password = $_REQUEST["password"];

echo login($userName, $password);

function login($login, $pass) {
    if (isAuthenticUser($userName, $password)) {
        $_SESSION["authenticated"] = true;
    } else $_SESSION["authenticated"] = false;

    return $_SESSION["authenticated"];
}

另一个文件.php

<?php
session_start();

echo $_SESSION["authenticated"];
?>

但请记住,您应该在文件开头调用 session_start() 函数或在 php.ini [php 配置文件] 中设置 session.auto_start = true

于 2013-10-08T16:18:32.120 回答