当我处理我的购物车有两个项目。数据库使用新的可用数量更新每个项目大小,但似乎购物车中有多个项目,然后第二个/第三个/第四个项目大小使用新的可用数量更新,但第一个项目选择其他项目数量并将它们添加到尺寸细节和更新项目自己的尺寸详细信息。
我在订单确认页面中调整了库存明细
//调整库存
$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
我有一个显示我可用数量的选择框
$string_array = explode(':', $string);
$size = $string_array['0'];
$available = $string_array['1'];
if ($available > 0){
echo ''.$size.'
('.$available.' Available)';
}
if ($available <= 0){
echo 'No more left';
}
} ?>
这在我的产品页面的底部:
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 += '
';jQuery('#product_errors').html(error);
return;
} else if (quantity > available){
error += '
';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");},
});
}
}