PHP Sessions购物车:如果产品已经为会话ID,则更新产品

时间:2014-03-28 14:54:00

标签: php session-variables shopping-cart

我一直在努力为$_SESSION的简单购物车找到解决方案。 我保持非常简单,这是我现在的代码

if ( Input::isPost('add') ) {

    $id = Input::get('id');
    $qta = Input::post('qta');
    $size = Input::post('size');

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

    if ( array_key_exists($id, $_SESSION['cart']) ) {
        if ( $_SESSION['cart'][$id][0] == $size ) {
            $_SESSION['cart'][$id][1]+=$qta;
        } else {
            $_SESSION['cart'][$id] = array( $size, $qta );
        }
    } else {
        $_SESSION['cart'][$id] = array( $size, $qta );
    }

}

那么,这段代码的作用是什么?

1)如果$_SESSION['cart']不存在,请创建它,否则添加新项目。 2)当您向购物车添加商品时,您必须选择该商品的尺寸和数量。 3)如果购物车数组中已存在该商品,请检查尺寸是否相同,如果是,请更新数量。这是问题,如果项目已经存在(检查$_SESSION['cart'][$id])但是大小不同,请不要更新当前项目,而是创建新项目。问题是当前正在替换当前的一个,而不是2个具有相同id但不同size的产品,我只有最新的产品。

如果你能帮我解决,我会非常感激!

提前谢谢你。

4 个答案:

答案 0 :(得分:1)

更好的方法是创建另一个名为sizes的数组并在那里存储大小。所以你的代码看起来像

if (in_array($size, $_SESSION['cart'][$id]['sizes'])) {
    //The size has been added to the cart
} else {
    //The size isn't in the cart so add it
    $_SESSION['cart'][$id]['sizes'][] = $size;
}

而不是存储数量

$_SESSION['cart'][$id][1]+=$qta;

为什么没有更多有意义的密钥,这样您就可以更好地理解数组的内容。例如

$_SESSION['cart'][$id]['qty']+=$qta;

答案 1 :(得分:1)

尝试将大小用作多维数组中额外维度的键。您当前的代码只允许每个项目有一个尺寸。

你最终会得到类似的东西:

if ( Input::isPost('add') ) {

    $id = Input::get('id');
    $qta = Input::post('qta');
    $size = Input::post('size');

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

    if ( array_key_exists($_SESSION['cart'][$id][$size]) ) {
        $_SESSION['cart'][$id][$size] += $qta;
    } else {
        $_SESSION['cart'][$id][$size] = $qta;
    }
}

答案 2 :(得分:1)

问题在于:

if ( $_SESSION['cart'][$id][0] == $size ) {
    $_SESSION['cart'][$id][1]+=$qta;
} else {
    $_SESSION['cart'][$id] = array( $size, $qta );
}

如果大小不同,则用新数组(bloc的else)替换它。 那是你的阵列:

Array(
    'cart'=>array(
        'id'=>array('size', 'qta')
    )
)

使用这种结构,你只能有一个id的大小,所以如果你想添加另一个而不是替换旧的,你应该考虑使用它:

Array(
    'cart'=>array(
        'id'=>array(0=>array('size1'=>'qta1'), 1=>array('size2'=>'qta2'))
    )
)

当然,这意味着你需要遍历数组以找到合适的大小,然后更新qta。不好玩。

使用此结构可能更有趣:

Array(
    'cart'=>array(
        'id'=>array('size1'=>'qta1', 'size2'=>'qta2')
    )
)

因此,您只需检查$_SESSION['cart'][$id][0] == $size是否存在(使用array_key_exists)而不是检查$_SESSION['cart'][$id][$size],然后继续:)

答案 3 :(得分:0)

$postedQuantity = intval($_POST['quantity']);
$postedProduct = $_POST['product'];
$postedSize = $_POST['size'];

$productId = $_POST['product'] . $_POST['size'];// concat the product name/Id and //the size form a new array-key.it will be unique.

if(empty($_SESSION)){
$_SESSION['cart_items'] = array();
}

if(empty($_SESSION['cart_items'])) {
    $_SESSION['cart_items'][$productId] = array('name'=> $_POST['product'],
                                            'quantity'=> intval($_POST['quantity']),
                                            'size'=>$_POST['size'],
                                 );
} elseif(!array_key_exists($productId,$_SESSION['cart_items'])) {
    $_SESSION['cart_items'][$productId] = array('name'=> $_POST['product'],
                                  'quantity'=> intval($_POST['quantity']),
                                  'size'=>$_POST['size'],
                                 );
}
else { 
   $_SESSION['cart_items'][$productId]['quantity'] += $postedQuantity;
}