使用ajax调用设置会话变量时,我遇到了问题。 我有一个将商品添加到购物车的按钮,该商品由子文件夹中的文件处理。
我一开始就调用session_start(),就像这样:
<?php
//header.php
session_start();
echo session_id();
?>
我使用这种形式在index.php中发起ajax调用:
<form class="add-cart-form" action="" method="POST">
<input type="hidden" name="id" value="<?php echo $item[14]?>">
<input type="hidden" name="qty" value="1">
<input type="hidden" name="add_to_cart">
<input type="submit" value="Add to shopping cart">
</form>
我在文件夹asset / scripts.js中有一个单独的script.js,它执行ajax调用:
$(document).ready(function() {
$(".add-cart-form").on('submit', function(e) {
$(".sb").addClass("blur");
$("#overlay-wrap").slideToggle();
$.ajax({
url: 'handlers/cart-handler.php',
type: 'POST',
data: $(this).serialize(),
success: function(data) {
$(".cart-size-number").html(data);
}
});
e.preventDefault();
});
});
最后是应该更新会话变量的cart-handler.php:
<?php
session_start();
#Add items to the shoppingcart array
if(isset($_POST["add_to_cart"])) {
if(isset($_SESSION["shopping_cart"])) {
$item_array_id = array_column($_SESSION["shopping_cart"], 'item_id');
if(!in_array($_POST['id'], $item_array_id)) {
$item_array = array(
'item_qty' => $_POST['qty'],
'item_id' => $_POST['id']
);
array_push($_SESSION["shopping_cart"], $item_array);
}
} else {
$item_array = array(
'item_qty' => $_POST['qty'],
'item_id' => $_POST['id']
);
$_SESSION["shopping_cart"][0] = $item_array;
}
}
#Output amount of items
echo sizeof($_SESSION['shopping_cart']);
?>
问题
如您所见,在header.php中,我回显了会话ID以检查其是否保持一致。每当我通过将产品添加到购物车来进行ajax调用时,以下任一情况都会随机发生:
在第二种情况下,起始于header.php的初始会话现在被cart-handler.php取代。购物车仍然是空的,但是从现在开始,购物车系统可以正常工作,因为它现在继续使用新的会话。
我想知道为什么
session_start();
cart-handler.php中的有时会覆盖现有会话,而有时会与原始会话进行吗?如何更改数据流,以便程序始终使用原始会话?
编辑 经过测试后,似乎在页面之间切换时session_id发生了变化。如果我首先加载index.php,我将获得会话ID。当我单击下一页时,我看到相同的会话ID。但是现在当我返回索引时,会话ID会更改。因此它被覆盖,并且此后,会话ID停止在页面之间更改。这怎么可能?我几乎已经花了2天的时间来解决这个问题。
编辑2
好的,我知道了。我有一些按钮重定向到https://www.example.com,但是我正在访问https://example.com处的索引,这显然是两个单独的实体,它们在处理各自的唯一会话。我将所有链接更改为完整URL,现在通过.htaccess强制www,以使会话保持一致。太简单了,以至于这个选项我什至都没想到。