相关:session variable not carrying over
问题
当我从一个页面导航到另一个页面时,任何$ _SESSION [“”]变量都会丢失,尽管我在尝试访问它们之前使用session_start();
。
session_start()
似乎会自动启动新会话,除非向其传递session_name()
或session_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?
?>
通过$_COOKIE["cookie_name"]
检索会话ID是否足够,或者为了能够继承我的会话变量值,我还应该做些什么吗?
更新
进行更深入的挖掘,我发现在正常情况下,人们不需要使用cookie来恢复会话,因为PHP通过PHPSESSID cookie自动执行,我不必关心。< / p>
但是,我使用jQuery $.post()
和$.ajax()
函数与PHP服务器进行通信,因此它不能像往常那样使用URL自动获取/发布SID。
考虑到这一点,我设法找到了一种手动处理cookie的方法,因此我不会将此处提到的会话和cookie与其他SO用户混在一起:
PHP Session Not Restoring from Cookies
更新#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()
且我无法访问$_SESSION["authenticated"]
的部分时。
答案 0 :(得分:2)
如果你想使用Session,你不需要创建Cookie,因为它是由php创建的,就像你说的那样。
为了在每个php页面的开头使用会话地点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*/
?>
答案 1 :(得分:2)
使用会话时不需要设置cookie名称。 php处理会话需要的每一件事。 php使用名称PHPSESSION设置cookie并使用cookie处理会话ID。 你的项目应该是这样的。
<强>的login.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"];
}
<强> another_file.php 强>
<?php
session_start();
echo $_SESSION["authenticated"];
?>
但请记住你应该在文件开头调用session_start()函数或在php.ini中设置session.auto_start = true [php配置文件]