使用Ajax调用设置会话时出现无法预料的行为

时间:2019-06-27 19:39:25

标签: php jquery ajax variables session

使用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调用时,以下任一情况都会随机发生:

  1. 会话ID保持不变,一切正常运行
  2. 会话ID更改,未设置购物车的会话变量

在第二种情况下,起始于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,以使会话保持一致。太简单了,以至于这个选项我什至都没想到。

0 个答案:

没有答案