【发布时间】: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) 之间来回切换可能会导致这种情况,我相信您的购物车页面是安全的......