首页 > 解决方案 > 为购物车中的项目更新数据库是将两个项目添加到一行中

问题描述

当我用两件物品处理我的购物车时。数据库用新的可用数量更新每个项目的大小,但如果购物车中有多个项目,那么第二/第三/第四个项目的大小会随着新的可用数量更新很好,但第一个项目会选择其他项目数量并将它们添加到尺寸详细信息并更新项目自己的尺寸详细信息。

我的订单确认页面中的调整库存详细信息

//调整库存

  $itemQ = $db->query("SELECT * FROM cart WHERE id = '{$cart_id}'");
  $iresults = mysqli_fetch_assoc($itemQ);
  $items = json_decode($iresults['items'],true);

foreach($items as $item){
 $newsizes = array();
 $item_id = $item['id'];
 $productQ = $db->query("SELECT sizes FROM products WHERE id = '{$item_id}'");
 $product = mysqli_fetch_assoc($productQ);
 $sizes = sizesToArray($product['sizes']);

 foreach($sizes as $size){
   if($size['size'] == $item['size']){
   $q = $size['quantity'] - $item['quantity'];
   $newSizes[] = array('size' => $size['size'],'quantity' => $q);
  }else{
  $newSizes[] = array('size' => $size['size'],'quantity' => $size['quantity']);
 }
}
 $sizesString = sizesToString($newSizes);
 $db->query("UPDATE products SET sizes = '{$sizesString}' WHERE id = '{$item_id}'");
}

我的函数 sizeToString 和 sizesToArray 存储在帮助文件中

function sizesToArray($string){
$sizesArray = explode(',',$string);
$returnArray = array();
foreach($sizesArray as $size){
  $s = explode(':',$size);
  $returnArray[] = array('size' => $s[0], 'quantity' => $s[1]);
}
return $returnArray;
}

function sizesToString($sizes){
$sizesString = '';
foreach($sizes as $size){
  $sizesString .= $size['size'].':'.$size['quantity'].',';
}
$trimmed = rtrim($sizesString, ',');
return $trimmed;
}

我已经浏览了我的代码,但我看不出它正在做它正在做的事情的原因。我的想法是,如果我的代码在循环,那么在数据库中更新的每个项目都会有同样的问题,而不仅仅是第一个项目。

任何帮助将不胜感激。

编辑 Helpers.php

function sizesToArray($string){
$sizesArray = explode(',',$string);
$returnArray = array();
foreach($sizesArray as $size){
  $s = explode(':',$size);
  $returnArray[] = array('size' => $s[0], 'quantity' => $s[1]);
}
return $returnArray;
}

function sizesToString($sizes){
$sizesString = '';
foreach($sizes as $size){
  $sizesString .= $size['size'].':'.$size['quantity'].',';
}
$trimmed = rtrim($sizesString, ',');
return $trimmed;
}

1) - 购物车的内容在 db 表购物车中,项目字符串保存如下

  [{"id":"247","size":"W5000W","quantity":2}]
  [{"id":"242","size":"MK120","quantity":"2"}]

2) - 购物车结帐前的产品内容尺寸字符串看起来像这样

 Prod id: 247
 sizes: W5000W:20 
 Prod id: 242
 sizes: MK120:20

3)结帐后的预期结果:

  Prod id: 247
  sizes: W5000W:18 
  Prod id: 242
  sizes: MK120:18

4)结帐后的实际结果:购物车结帐后,尺寸字符串看起来像这样(在我订购了每个项目两个之后)

Prod id: 247
sizes: W5000W:18, MK120:18
Prod id: 242
sizes: MK120:18

注意:prod id 247 首先添加到购物车中,

编辑 18/9

我有一个选择框,显示我的可用数量

  <select name="size" id="size" class="form-control">
         <option value=""></option>
         <?php foreach($size_array as $string) {
         $string_array = explode(':', $string);
         $size = $string_array['0'];
         $available = $string_array['1'];
        if ($available > 0){
            echo '<option value="'.$size.'" data-available="'.$available.'">'.$size.' 
            ('.$available.' Available)</option>';
        }
        if ($available <= 0){
          echo '<option value="">No more left</option>';
        }
      } ?>
     </select><br>

这在我的产品页面底部:

 jQuery('#size').change(function(){
  var available = jQuery('#size option:selected').data("available");
  jQuery('#available').val(available);
 });

我的页脚中有这个,这是库存数量的验证。从理论上讲,我正在写的东西可以工作,但不想在现实中工作。

function add_to_cart(){
  jQuery('#product_errors').html("");
  var size = jQuery('#size').val();
  var quantity = jQuery('#quantity').val();
  var available = parseInt(jQuery('#available').val());
  var error = '';
  var data = jQuery('#add_product_form').serialize();

  if (size == '' || quantity == '' || quantity == 0){
    error += '<div class="alert alert-danger alert-dismissible" i 
    id="product_errors"><a href="#" class="close" data-dismiss="alert" aria- 
    label="close">&times;</a><strong>Error!</strong> You must select a size 
      and quantity before continuing.</div>';
   jQuery('#product_errors').html(error);
   return;
   } else if (quantity > available){
     error += '<div class="alert alert-danger alert-dismissible" 
   id="product_errors"><a href="#" class="close" data-dismiss="alert" aria- 
   label="close">&times;</a><strong>Error!</strong> We have only 
   '+available+' available. </div>';
    jQuery('#product_errors').html(error);
    return;
  } else{
   $.ajax({
  url : 'add_cart.php',
  method : 'post',
  data : data,
  success : function(){
    location.reload();
    window.location.href = "basket.php";
  },
  error : function(){alert("Something went wrong");},
  });
  }
  }

标签: php

解决方案


您在单个单元格中保存多个值的方法是错误的 - 您的表格实际上应该如下所示:

+------------+---------+----------+
| Product_id | Size_id | Quantity |
+------------+---------+----------+
|     247    |    7    |     20   |
+------------+---------+----------+
|     242    |    4    |     20   |
+------------+---------+----------+

此外,您还需要 2 个其他表格 - 产品和尺寸:

+------------+--------------+
| product_id | product_name |
+------------+--------------+
|     247    | Jacket       |
+------------+--------------+
|     242    | Shoe         |
+------------+--------------+

+---------+-----------+
| size_id | size_name |
+---------+-----------+
|   7     | W5000W    |
+---------+-----------+
|   4     | MK120     |
+---------+-----------+

无论如何,如果你想继续使用你的数据模型,那么代码应该是这样的:

function sizesToArray($string)
{
  $sizesArray = explode(',',$string);
  $returnArray = array();
  foreach($sizesArray as $size)
  {
    $s = explode(':',$size);
    // by using keyed array you are saving the FOREACH-loop 
    // for finding the relevant size
    $returnArray[$s[0]] = $s[1];
  }
  return $returnArray;
}

// you can also use array_map() to return an array of "SIZE:QUANTITY" elements
// and then use implode(",") on it
function sizesToString($sizes)
{
  $sizesString = '';
  // $sizes is keyed by SIZE_NAME
  foreach($sizes as $size_name => $size_qty)
  {
    $sizesString .= $size_name.':'.$size_qty.',';
  }
  $trimmed = rtrim($sizesString, ',');
  return $trimmed;
}

$itemQ = $db->query("SELECT * FROM cart WHERE id = '{$cart_id}'");
$iresults = mysqli_fetch_assoc($itemQ);
$items = json_decode($iresults['items'],true);

foreach($items as $item)
{
  $item_id = $item['id'];
  $productQ = $db->query("SELECT sizes FROM products WHERE id = '{$item_id}'");
  $product = mysqli_fetch_assoc($productQ);
  $sizes = sizesToArray($product['sizes']);
  $sizes[$item['size']] -= $item['quantity']; // we deduce the relevant q-ty
  $sizesString = sizesToString($sizes);
  $db->query("UPDATE products SET sizes = '{$sizesString}' WHERE id = '{$item_id}'");
}

推荐阅读