首页 > 解决方案 > 使用 Ajax 调用设置会话时出现不可预测的行为

问题描述

我在使用 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>

我在文件夹 assets/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,以便会话保持一致。如此愚蠢的简单,以至于我什至没有想到这个选项。

标签: phpjqueryajaxvariablessession

解决方案


推荐阅读