添加到$ _SESSION数组的第一项添加了TWICE ......为什么?

时间:2014-08-28 16:58:21

标签: php arrays session cart

昨天我在SO HERE上发布了一个关于我正在使用的多维$_SESSION数组的问题,以跟踪我正在开发的购物车中的商品。其中一个非常有用的回复建议我创建$_SESSION数组而不是多维数组,我同意这是一种更平滑的方法。

当用户点击“添加到购物车”中的任何一个时,会启动$_SESSION阵列。商店页面上的按钮。我使用多维数组的原始代码是:

$quantity = 1;

// add first item from shop page
if(isset($_POST['add_item']) && (!isset($_SESSION['cart']))) {
    $_SESSION['cart'] = array();
    $_SESSION['cart'][$_POST['product_description']] = array('quantity' => $quantity, 'price' => $_POST['product_price']);
    header("Location: http://website.com/cart.php");
    }

这很好用,但我无法达到我想要的结果(见另一篇文章)。

我建议使用的代码是:

$quantity = 1;

// add first item from shop page
if(isset($_POST['add_item']) && (!isset($_SESSION['cart']))) {
$_SESSION['cart'][] = array('product_description'=> $_POST['product_description'], 'quantity' => $quantity, 'price' => $_POST['product_price']);
header("Location: http://website.com/cart.php");
}

并且效果很好并且允许我做我想做的事情(再次,请参阅其他帖子了解详情)。

...无论其

无论哪个'添加到购物车'在商店页面上单击按钮(只有四个),FIRST点击获取添加到$_SESSION['cart']数组TWICE的信息。之后单击的每个其他按钮仅输入一次。同样,首先点击哪个按钮并不重要,无论如何都会发生这种情况。

以下是新print_r数组代码$_SESSION的结果:

Array
(
    [0] => Array
        (
            [product_description] => iPhone case - Black
            [quantity] => 1
            [price] => 9.49
        )

    [1] => Array
        (
        [product_description] => iPhone case - Black
        [quantity] => 1
        [price] => 9.49
    )

)

我已经搜索了SO和谷歌,了解为什么会这样,但无论我如何说出我的疑问,我都无法找到任何有用的东西。

它必须是我想念的简单......

真诚地感谢!

更新

为了澄清,商店页面上只有4个项目。再也不会有了。为了让事情变得简单,每个项目都有自己的“添加到购物车”。按钮。单击按钮后,用户将进入购物车页面,他们可以调整数量或删除项目,然后查看取消并清除购物车或继续购物。

2 个答案:

答案 0 :(得分:0)

您的描述似乎表明您需要以下内容:

  • 检查购物车是否存在,如果不存在则创建

  • 然后将该项目添加到购物车

如果您还没有购物车,那么您发布的代码似乎只会添加一个项目。

我能想到的双重项目的唯一原因是代码比你发布的更多,并且你在“创建购物车”和后来的“添加项目”中都有“添加项目”位的代码“块。

这就是我要做的事情:

quantity = 1;

// ensure cart
if (!isset($_SESSION['cart'])) {
    $_SESSION['cart'] = array();
}

// add item from shop page
if(isset($_POST['add_item'])) {
    $_SESSION['cart'][$_POST['product_description']] = array(
        'quantity' => $quantity, 
        'price' => $_POST['product_price']
    );

    // or if you prefer the numeric indexed array:
    // $_SESSION['cart'][] = array(
    //     'product_description'=> $_POST['product_description'], 
    //     'quantity' => $quantity, 
    //     'price' => $_POST['product_price']);

    header("Location: http://website.com/cart.php");
}

我已经修改了你的代码以保持逻辑简单,但是像@dognose评论:不要相信通过帖子传递的价格。攻击表单并发布不良数据以便以0.01美元的价格获取您的资料非常简单。

答案 1 :(得分:-2)

无法回答,因为未提供完整代码;但是:

$_SESSION = array_map("unserialize", array_unique(array_map("serialize", $_SESSION)));

将删除会话中的重复项。