【问题标题】:Why is session lost between SOME pages, not all?为什么某些页面之间的会话丢失,而不是全部?
【发布时间】:2015-10-15 21:02:51
【问题描述】:

我对 PHP 还是很陌生,但我的网店正在苦苦挣扎。

我的网站上有一个下拉菜单,其中一个菜单选项包含网店中的所有产品类别。只要我在这些类别之间导航,我的会话就会持续并且工作正常(我将产品放在购物袋中,我可以移动到购物车并完成整个订单)。但是,如果我转到网上商店“外部”的另一个下拉菜单选项中的页面(如联系页面),我的会话就会丢失。我使用几乎相同的模板来创建这些页面,但它们当然更简单,主要是文本内容(除了始终可以从顶部菜单访问的购物车)。

网店下拉菜单选项之外的第一页可以使用正确的会话 ID,但是当我移动到第二页时会话消失了。我访问页面的顺序无关紧要。第一个始终有效,但以下无效。

究竟是什么导致了这种行为?在每一页我都从这段代码开始:

<?php
session_start();
?>

<!DOCTYPE HTML>
...

再往下,我将购物车包含在顶部菜单中:

$path = $_SERVER['DOCUMENT_ROOT'];
$path .= "/includes/right-cart.inc";
include_once($path);

在包含的购物车代码中,我使用这一行作为会话 ID:

$currSession = session_id();

有什么想法吗?

编辑 1:

我尝试添加一些错误日志并注意到一些有趣的东西。我现在开始我的文件(只是为了了解更多信息):

<?php
phpinfo();
ini_set('session.save_path',realpath(dirname($_SERVER['DOCUMENT_ROOT']) . '/../session'));
session_start();
// create session variable if it doesn't exist yet
if (isset($_SESSION['counter']))
  $_SESSION['counter'] ++;
else
  $_SESSION['counter'] = 1;

var_dump($_SESSION); echo "<br/>\n";
var_dump(session_id()); echo "<br/>\n";
var_dump(session_name()); echo "<br/>\n";
var_dump(session_get_cookie_params()); echo "<br/>\n";
?>

只要我有第一行,phpinfo();,会话似乎是一样的。但是,如果我删除该行,刷新页面时会话会不断更新...

编辑 2

根据建议,我尝试使用 cookie 来存储“会话 ID”而不是常规会话。我页面顶部的代码现在看起来像这样:

<?php
session_start();
$currSession = "";
$cookie_name = "sessionId";
$cookie_value = "";
if(!isset($_COOKIE[$cookie_name])) {
    $cookie_value = session_id();
    setcookie(  $cookie_name, $cookie_value, time() + (60*60*24*2), "/");
}
if(count($_COOKIE) > 0) {
    $currSession = $_COOKIE[$cookie_name];
} else {
    $currSession = session_id();
}
?>

但每次我重新加载页面时,cookie 值似乎也会发生变化。我在代码中尝试了不同的 echo 语句来验证发生了什么,但一切看起来都是正确的(cookie 已成功创建,isset 函数告诉我 cookie 实际上已设置等),但 cookie 中的值仍然发生变化。有什么想法吗?

【问题讨论】:

  • 第二个页面和第一个页面在同一个子域中?
  • 是的,它们都在同一个子域上。也在服务器上的同一文件夹中。
  • 它是一个共享主机,我应该添加 maby(或其他任何名称......):-)
  • 页面是否从 www.yourdomain 更改为 yourdomain.com,反之亦然?
  • 您肯定在离开一页以及加载新页时不会调用session_unset() 和/或session_destroy()?此外,在 SSL (https) 之间来回切换可能会导致这种情况,我相信您的购物车页面是安全的......

标签: php session


【解决方案1】:

我终于解决了这个问题,所以我想我会在这里发布答案,以防其他人遇到问题。

我改变了这一行(“/”):

setcookie($cookie_name, $cookie_value, time() + (60*60*24*2), "/");

到('/')

setcookie($cookie_name, $cookie_value, time() + (60*60*24*2), '/');

突然间它起作用了! :-)

【讨论】:

  • 不知道为什么要创建自己的session_id cookie
  • @DarkBee 好吧,我原来的帖子是关于我的 session_id 的问题,因为页面之间的会话不一致。 Ryan 提出了另一种基于 cookie 的解决方案,我得到了这个解决方案。但是,如果您对我最初的会议问题有解决方案,如果您愿意分享,我会更高兴:-)
猜你喜欢
  • 2019-04-04
  • 2012-06-15
  • 2016-03-17
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
相关资源
最近更新 更多