我正在使用 PHP 本地制作电子商务系统,一切正常。
除了当客户添加相同产品但颜色或尺寸与添加到购物车中的产品不同时,我无法复制购物车中的产品。
如果客户再次选择不同尺寸或颜色的相同产品,他所做的就是更新以前的尺寸和颜色,这并不理想,理想的是复制该产品。
我的代码
购物车.php
<?php
session_start();
require "config.ini.php";
$itemCount = isset($_SESSION['cart']) ? count($_SESSION['cart']) : 0;
if (isset($_SESSION['qty'])) {
$meQty = 0;
foreach ($_SESSION['qty'] as $meItem){
$meQty = $meQty + $meItem;
}
} else {
$meQty = 0;
}
if (isset($_SESSION['cart']) and $itemCount > 0){
$itemIds = "";
foreach ($_SESSION['cart'] as $itemId){
$itemIds = $itemIds . $itemId . ",";
}
$inputItems = rtrim($itemIds, ",");
$meSql = "SELECT * FROM products WHERE id in ({$inputItems})";
$meQuery = mysqli_query($kcon, $meSql);
$meCount = mysqli_num_rows($meQuery);
} else {
$meCount = 0;
}
if ($meCount == 0){
echo "<div class=\"alert alert-warning\">No hay artículos en la cesta</div>";
}else{
?>
<form action="updatecart.php" method="post" name="fromupdate">
<table class="table">
<tr>
<td>Producto</td>
<td>Precio</td>
<td>Cantidad</td>
<td>Total</td>
</tr>
<?php
$total_price = 0;
$num = 0;
$iva = 12;
$shipping = 50;
while ($meResult = mysqli_fetch_assoc($meQuery)){
$key = array_search($meResult['id'], $_SESSION['cart']);
$total_price = $total_price + ($meResult['price'] * $_SESSION['qty'][$key]);
$intemId=$meResult['id'];
$color = $_SESSION['colors'][$intemId];
$size = $_SESSION['size'][$intemId];
if ($total_price > 50){
$shipping = 0;
}
?>
<tr>
<td class="cart-image">
<img src="<?php echo $meResult['image']; ?>" />
<div class="cart-items">
<h3><?php echo $meResult['product']; ?><?php echo $color; ?><?php echo $size?></h3>
</div>
</td>
<td class="cart-price"><?php echo $meResult['price']; ?></td>
<td>
<input type="text" name="qtyupdate[<?php echo $num; ?>]" value="<?php echo $_SESSION['qty'][$key]; ?>" class="form-control" style="width: 60px;text-align: center;" autocomplete="off" data-validation="number" data-validation-allowing="float">
<input type="hidden" name="arr_key_<?php echo $num; ?>" value="<?php echo $key; ?>">
<a class="btn btn-danger btn-lg" href="removecart.php?itemId=<?php echo $meResult['id']; ?>" role="button">
<span class="glyphicon glyphicon-trash"></span>Eliminar</a>
</td>
<td>$<?php echo number_format(($meResult['price'] * $_SESSION['qty'][$key]),2); ?></td>
<?php
$num++;
}
}
?>
更新购物车.php
<?php
session_start();
$itemId = isset($_GET['itemId']) ? $_GET['itemId'] : "";
$_SESSION['colors'][$itemId]=$_POST['colors'];
$_SESSION['size'][$itemId]=$_POST['size'];
if ($_SERVER['REQUEST_METHOD'] == 'POST' and isset($_POST['qtyupdate'])) {
for ($i = 0; $i < count($_POST['qtyupdate']); $i++) {
$key = $_POST['arr_key_' . $i];
$_SESSION['qty'][$key] = $_POST['qtyupdate'][$i];
}
} else {
$qty = isset($_POST['qty']) ? $_POST['qty'] : 1;
if (!isset($_SESSION['cart'])) {
$_SESSION['cart'] = array();
$_SESSION['qty'][] = array();
}
if (in_array($itemId, $_SESSION['cart'])) {
$key = array_search($itemId, $_SESSION['cart']);
$_SESSION['qty'][$key] = $_SESSION['qty'][$key] + $qty;
} else {
array_push($_SESSION['cart'], $itemId);
$key = array_search($itemId, $_SESSION['cart']);
$_SESSION['qty'][$key] = $qty;
}
}
header('location:cart.php');
?>
在产品详细信息中,我select
添加了产品尺寸:
<select name="size">
<option value="XL">XL</option>
<option value="M">M</option>
</select>
以及产品的颜色:
<div id="cont-colors">
<input id="id-7" type="radio" name="colors" class="selector-colors" value="Verde">
<label for="id-7" title="Verde" id="colors" style="background:#008000;"></label>
<input id="id-8" type="radio" name="colors" class="selector-colors" value="Azulado">
<label for="id-8" title="Azulado" id="colors" style="background:#008080;"></label>
</div>
并发送:
<form method="post" action="updatecart.php?itemId=3">
使用您当前处理的代码,无法在会话变量中复制项目,在应用程序中添加此范围的唯一方法是重新考虑如何处理项目的结构,我并不是说停止使用会话。
我建议您为每个项目生成一个带有附加索引的数组
您可以将按钮与此 $tempid 以及 id 相关联,以便您可以创建一个结构:
这样如果你添加一个Item,你就可以测试一个具有它的特性的item是否存在:
您将不得不根据您的需要调整此答案,如果该解决方案无法回答您的问题,请不要否定,忽略它。
正如我看到的代码,修改数量和颜色的原因是因为您
updatecart.php
正在覆盖它们的值。由于相同的文章即使有不同的颜色或尺寸也具有相同的 id,最后分配的颜色和尺寸将是文章的一般值。
要解决此问题,您必须为 Item、Color 和 Size 的数组一创建更多维度:
这将需要更改应用程序的逻辑,特别是您如何保存购物车。
你可以这样做:
购物车.php
更新购物车.php
我希望这能澄清我的观点。