我想在购买后更新数据库中我产品的库存数量。
我的代码已经可以正常工作,但是我想知道是否只有一个SQL语句才是最好的方法?
// All the product in the member's cart
if ($stmt = $conn->prepare("SELECT product_id, quantity FROM tbl_cart WHERE member_id = ?")) {
$stmt->bind_param("i", $memberId);
$stmt->execute();
$result = $stmt->get_result();
$stmt->close();
$cartItem = $result->fetch_all(MYSQLI_ASSOC);
// Set the quantity after purchase
foreach ($cartItem as $key => $item) {
$stmt = $conn->prepare("UPDATE tbl_product SET stock = stock-? WHERE id = ?");
$stmt->bind_param("ii", $item['quantity'], $item['product_id']);
$stmt->execute();
$stmt->close();
}
}
答案 0 :(得分:0)
我不知道这是否是更好的方法,但是您可以尝试使用此Sql语句。
UPDATE tbl_product
SET stock = stock - ( SELECT quantity FROM tbl_cart
WHERE product_id = tbl_product.id AND member_id = ? )
WHERE id IN ( SELECT product_id FROM tbl_cart WHERE member_id = ? )
答案 1 :(得分:0)
您可以尝试使用触发功能。看这里:mysql after insert trigger which updates another table's column
您可以在下订单时更新其他列。
我认为,触发器功能不是最佳选择,因为它将逻辑转移到其他地方。
但这是您要求的替代方法之一。
答案 2 :(得分:0)
这就是我找到的解决方案。我认为这更干净。
$stmt = $conn->prepare("UPDATE tbl_product AS p
JOIN tbl_cart AS c
ON p.id = c.product_id
SET p.stock = p.stock-c.quantity
WHERE c.member_id = ?");
$stmt->bind_param("i", $memberId);
$stmt->execute();
$stmt->close();
谢谢您的帮助。