Php 如何使用cookies手动恢复会话?

Php 如何使用cookies手动恢复会话?,php,session,session-variables,session-cookies,sessionid,Php,Session,Session Variables,Session Cookies,Sessionid,相关的: 问题 当我从一个页面导航到另一个页面时,任何$u SESSION[]变量都会丢失,尽管我使用的是SESSION\u start;在试图接近他们之前 会话启动似乎会自动启动新会话,除非向其传递会话名称或会话id以指定要恢复的会话 因此,当需要从服务器端显示/隐藏按钮时,按钮永远不会显示,尽管已验证的用户之前已经过身份验证 我在几篇文章中读到,setcookie可以做到这一点 编辑 我必须手动设置会话id的cookie,如下所述: 代码示例 login.php 通过$\u COOKIE[C

相关的:

问题

当我从一个页面导航到另一个页面时,任何$u SESSION[]变量都会丢失,尽管我使用的是SESSION\u start;在试图接近他们之前

会话启动似乎会自动启动新会话,除非向其传递会话名称或会话id以指定要恢复的会话

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

我在几篇文章中读到,setcookie可以做到这一点

编辑

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

代码示例

login.php

通过$\u COOKIE[COOKIE\u name]检索会话id就足够了吗?还是我应该做些其他事情以便能够携带会话变量值

更新

在深入挖掘之后,我发现在正常情况下,不需要使用cookie来恢复会话,因为PHP会通过PHPSESSID cookie自动恢复会话,我不必关心这一点

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

考虑到这一点,我设法找到了一种手动处理cookie的方法,因此我不会将会话和cookie混为一谈,正如这里向另一位so用户提到的:

更新2

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

这是:

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\u start,并且我无法访问我的$\u session[authenticated]。

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

为了在每个php页面的开头使用会话位置

如果要更改PHP会话创建的cookie名称,请使用


如果您想使用会话,您不需要创建Cookie,因为它是由php创建的,正如您所说

为了在每个php页面的开头使用会话位置

如果要更改PHP会话创建的cookie名称,请使用


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

login.php

另一个_file.php


但是请记住,您应该在文件的开头调用session\u start函数,或者在php.ini[php配置文件]中设置session.auto\u start=true,使用session时不需要设置cookie名称。 php处理会话所需的一切。 php使用名称PHPSESSION设置cookie,并使用cookie处理会话id。 你的项目应该是这样的

login.php

另一个_file.php


但是请记住,您应该在文件开头调用session\u start函数,或者在php.ini[php配置文件]中设置session.auto\u start=true

当我从一个页面导航到另一个页面时,任何$\u session[]变量都会丢失。您真的想通过代码解决这个问题吗?实际上,这是因为我使用jQuery浏览网站的不同部分。因此,PHP使用的自动机制,即将自己的会话id放在url参数的第一个位置,不起作用。所以,我想手动执行一些操作。当我从一个页面导航到另一个页面时,任何$\u SESSION[]变量都会丢失。你真的想通过代码解决这个问题吗?实际上,这是因为我使用jQuery在网站的不同部分导航。因此,PHP使用的自动机制,即将自己的会话id放在url参数的第一个位置,不起作用。所以,我想手动做一些事情。事实上,这在使用标准网页时非常有效。但是,当您使用jQuery发布、ajax或在页面本身的一个简单div中加载内容时,此机制根本不起作用,因此,尽管您在网站上导航,URL永远不会更改。请确保在使用jQuery ajax调用调用的页面上使用session_start,由于jQuery发出的ajax调用会自动绑定请求中的cookie。请检查此答案,尝试使用简单的ajax页面调试问题,并在ajax返回结果中使用console.log+1手动打印包含会话ID的cookie的名称。也许您可以详细介绍一下如何设置cookie并使其在将来的引用中正常工作?您的php.ini会话配置似乎很好。你能给出你正在使用的示例代码吗?因为,看起来你就是我们
在一个页面上调用session\u name,下一个页面在session\u启动之前不调用它,这些函数一起工作,这意味着您必须调用session\u name(如果您正在使用它),然后在每个与$\u会话一起工作的页面上启动session\u,以及关于cookies,您不需要为PHP会话创建它们。事实上,在使用标准网页时,这非常有效。但是,当您使用jQuery发布、ajax或在页面本身的一个简单div中加载内容时,此机制根本不起作用,因此,尽管您在网站上导航,URL永远不会更改。请确保在使用jQuery ajax调用调用的页面上使用session_start,由于jQuery发出的ajax调用会自动绑定请求中的cookie。请检查此答案,尝试使用简单的ajax页面调试问题,并在ajax返回结果中使用console.log+1手动打印包含会话ID的cookie的名称。也许您可以详细介绍一下如何设置cookie并使其在将来的引用中正常工作?您的php.ini会话配置似乎很好。你能给出你正在使用的示例代码吗?因为,似乎您在一个页面上使用会话名称,而在下一个页面上,您没有在会话开始之前调用会话名称,所以这些函数一起工作,这意味着您必须调用会话名称,如果您使用会话名称,然后在与$\u会话和Cookie相关的每个页面上启动会话名称,您不需要为PHP会话创建它们。这在正常情况下可以正常工作。但是,它在我的场景中不起作用,因为我使用jQuery和jQuery UI弹出对话框,并在站点的部分之间导航,而从不更改URL!所以,它不起作用。当我访问$_SESSION[authenticated]时,页面会说我试图访问一个未定义的变量,这是因为SESSION_start总是启动一个新的会话,而不是恢复我想要的会话。因此,为了能够恢复会话,我需要设置会话Cookie来记住会话标识并恢复这个会话,而不是新的会话。+1这实际上并没有解决我的问题,但事实上,在清理会话后,它可以工作。我从未获得身份验证的原因之一是从未使用$login参数。我的错误,因为我重构了代码,在调用isAuthenticuser时忽略了更改$login的$userName参数。谢谢你的回答=这在正常情况下应有效。但是,它在我的场景中不起作用,因为我使用jQuery和jQuery UI弹出对话框,并在站点的部分之间导航,而从不更改URL!所以,它不起作用。当我访问$_SESSION[authenticated]时,页面会说我试图访问一个未定义的变量,这是因为SESSION_start总是启动一个新的会话,而不是恢复我想要的会话。因此,为了能够恢复会话,我需要设置会话Cookie来记住会话标识并恢复这个会话,而不是新的会话。+1这实际上并没有解决我的问题,但事实上,在清理会话后,它可以工作。我从未获得身份验证的原因之一是从未使用$login参数。我的错误,因为我重构了代码,在调用isAuthenticuser时忽略了更改$login的$userName参数。谢谢你的回答=
<?php
$sid = session_id();
if (empty($sid)) session_start($_COOKIE["cookie_name"]); // Will this make it?
?>
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
//Sample Php Page
<?php
session_name("eNGiT");
session_start();
/*Do your Session Based Stuff Below using $_SESSION variable*/
?>
<?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
session_start();

echo $_SESSION["authenticated"];
?>