【问题标题】:PHP Sessions shopping cart: update product if it's already id the sessionPHP Sessions 购物车:如果产品已经是会话,则更新产品
【发布时间】:2014-05-08 02:46:46
【问题描述】:

我一直在努力使用$_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])但大小不同,请不要更新当前项目,而是创建一个新项目。问题是当前的一个被替换而不是添加一个,所以我只有最新的一个,而不是两个具有相同id 但不同size 的产品。

如果你能帮我解决这个问题,我将非常感激!

提前谢谢你。

【问题讨论】:

    标签: php session-variables shopping-cart


    【解决方案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;
        }
    }
    

    【讨论】:

    • 天哪,真是太感谢你了。虽然我不得不修改 if 语句并检查 isset($_SESSION['cart'][$id][$size]) 而不是 array_key_exists() 因为数量将替换而不是添加到当前数量。再次感谢您!
    • 不用担心,很高兴能够提供帮助!
    【解决方案2】:

    更好的方法是创建另一个名为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;
    

    【讨论】:

      【解决方案3】:

      问题就在这里:

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

      如果大小不同,则将其替换为新数组(集团的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,只需检查$_SESSION['cart'][$id][$size] 是否存在(带有array_key_exists)并继续:)

      【讨论】:

      • 谢谢,与@JoseB 相同的解决方案,稍作修改后它就可以工作了。
      【解决方案4】:
      $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;
      }
      

      【讨论】:

      • 不工作。在执行附加操作之前保存到会话中的数量并替换旧数量。所以,总产品数量不正确。
      猜你喜欢
      • 2015-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-07
      • 1970-01-01
      • 2018-09-30
      • 2021-01-31
      • 2014-09-12
      相关资源
      最近更新 更多