我正在使用php和MySQL完成我的电子商务网站的学期项目。我用这两种工具建立了一个推车系统。出现的问题是,当购物车只包含一个项目时,它将按预期工作,即更新数据库中的反映数量"数量"柱。但是当我增加购物车中的商品时,它不会像我想的那样工作,即它只用最后一个商品数量更新整个数据库数量列。
以下是我的代码。
任何帮助都会非常有帮助现在我正在学习这些东西。
<div id="products_box"><!-- gets the products from the database section starts from here -->
<form action="cart.php" method="post" enctype="multipart/form-data">
<table width="750px" align="center" bgcolor="#0099CC">
<tr align="center">
<td><b>Remove</b></td>
<td><b>Product(s)</b></td>
<td><b>Quantity</b></td>
<td><b>Total Price</b></td>
</tr>
<?php
$ip_add = getIp();
$total = 0;
$sel_price = "select * from cart where ip_add = '$ip_add'";
$run_price = mysqli_query($db, $sel_price);
while($record = mysqli_fetch_array($run_price)){
$product_id = $record['product_id'];
$pro_price = "select * from products where product_id = '$product_id'";
$run_pro_price = mysqli_query($con, $pro_price);
while($p_price = mysqli_fetch_array($run_pro_price)){
$product_price = array($p_price['product_price']);
$product_title = $p_price['product_title'];
$product_img = $p_price['product_img2'];
$single_price = $p_price['product_price'];
$value = array_sum($product_price);
$total += $value;
?>
<tr>
<td><input type="checkbox" name="remove[]" value="<?php echo $product_id;?>"></td>
<td><?php echo $product_title;?><br><img src="admin_area/products_images/<?php echo $product_img;?>" width="80px" height="80px"></td>
<td><input type="text" name="qty" value="1" size="3" min="1"></td>
<?php
if(isset($_POST['update'])){
$qty = $_POST['qty'];
$insert_qty = "update cart set qty='$qty' where ip_add='$ip_add' AND product_id = '$product_id'";
$run_qty = mysqli_query($con, $insert_qty);
$total *= $qty;
}
?>
<td><?php echo $single_price ." ". "€"?></td>
</tr>
<?php
} // to include in the php code so it effects the whole row
}?>
<tr>
<td colspan="3" align="right"><b>Sub Total:</b></td>
<td><b><?php echo $total ." ". "€"?></b></td>
</tr>
<tr></tr>
<tr></tr>
<tr></tr>
<tr>
<td colspan="2"><input type="submit" name="update" value="Update Cart"></td>
<td> <input type="submit" name="continue" value="Continue Shopping"></td>
<td><button><a href="checkout.php" style="text-decoration:none; color:black;">Checkout</a></button></td>
</tr>
</table>
</form>
答案 0 :(得分:0)
提交HTML表单时,如果它包含多个具有相同名称的表单元素,则只发送最后一个表单元素。由于您的所有数量输入框都具有名称qty
,因此只会提交购物车中最后一个产品的数量,这就是为什么所有产品都以该数字结尾的原因。
PHP有一个功能,允许您在表单元素名称中使用方括号,最后使用数组数据(有关其工作原理的详细信息,请参阅http://php.net/manual/en/faq.html.php部分)。您可以使用[]
将值附加到数组(您已经为&#34执行;从购物车中移除项目&#34;复选框),或者您可以通过命名为其指定特定的数组键元素类似于qty[foo]
(最终会在$_POST['qty']['foo']
中)。
有几种不同的方法可以解决这个问题。由于这是一个项目,我只想指出一个可能的解决方案,并建议将数量表单元素更改为:
<input type="text" name="qty[<?php echo $product_id;?>">]" value="1" size="3" min="1">
然后查看$_POST
数据的样子。
您还需要修改更新数量代码,以确保使用适当产品的数量。
其他评论:
IP地址不是用户唯一的,因此这不是唯一识别购物车的好方法(您可能已经知道这一点)。目前,具有相同IP地址的用户将共享相同的购物车。
您的$total
计算看起来有点可疑(尝试使用不同的数量向购物车添加多个商品)。
您的脚本也容易受到SQL注入攻击。如果恶意用户在数量框中键入字符串1', product_id='123', ip_add='xxx.xxx.xxx.xxx
,请考虑您的SQL查询是什么样的 - 这将允许他们轻松地将任何产品添加到任何其他用户的购物车。