数据库
cart_tb表
row1: product_id = **3**, user_id = 10, ip_addr = '127.0.0.1', etc
row2: product_id = 4, user_id = 10, ip_addr = '127.0.0.1', etc)
如果我首先将现有商品放入购物车,然后然后另一个产品(用户还没有)
row3: product_id = **3**, user_id = 10, ip_addr = '127.0.0.1', etc - will be deleted
row4: product_id = 7, user_id = 10, ip_addr = '127.0.0.1', etc) - will be updated
结果:sql将检测该行并评估是否已经存在与我们放入购物车的商品类似的现有商品,因此将删除该商品。(第3行被删除)
cart_tb = 第 1 行、第 2 行、第 3 行
但是如果我首先将尚不存在的产品放入购物车,然后再将现有产品放入购物车
结果:
row3: product_id = 7, user_id = 10, ip_addr = '127.0.0.1', etc) - will be updated
row4: product_id = **3**, user_id = 10, ip_addr = '127.0.0.1', etc - wont delete??? why
cart_tb: row1(相同产品), row2, row3, row4(相同产品)
$sql = "SELECT product_id FROM cart WHERE user_id = -1 AND ip_address = '$ip_add' ";
$stmt = $heidisql->query($sql);
while ($test = $stmt->fetch(PDO::FETCH_ASSOC)) {
$product_list = $test['product_id'];
$verify_cart_count = "SELECT COUNT(cart_id) FROM cart WHERE user_id= '$userid' AND product_id = $product_list";
$verify_cart_row = $heidisql->query($verify_cart_count);
$data_exists = $verify_cart_row->fetchColumn();
// echo $data_exists; exit();
if ($data_exists < 1) {
//if result = 0, userid will be updated
$update_cart = "UPDATE cart SET user_id='$userid' WHERE ip_address = '$ip_add' AND user_id = -1";
$update_cart_result = $heidisql->prepare($update_cart);
$update_cart_result->execute();
} else {
//if result > 0, duplicate row need to be delete
$remove_exist_product = "DELETE FROM cart WHERE user_id = -1 AND ip_address= '$ip_add' AND product_id = $product_list ";
$remove_cart_result = $heidisql->prepare($remove_exist_product)->execute();
}
}
我认为 while 循环可能是问题...我不希望购物车中同一用户有重复的商品
最佳答案
问题是 UPDATE 查询。
table 购物车:
CREATE TABLE `cart` (
`cart_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`product_id` int(11) DEFAULT NULL,
`ip_address` varchar(40) DEFAULT NULL,
`user_id` int(11) DEFAULT NULL,
PRIMARY KEY (`cart_id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
如果用户未登录,则购物车表中的商品的 user_id = -1。 否则,cart.user_id = true 用户 ID
问题:
之前
card_id product_id user_id
1 2000 10
2 2001 10
4 2001 -1
5 2002 -1
运行代码...
之后
cart_id product_id user_id
1 2000 10
2 2001 10
5 2002 10
下一个示例:
之前
cart_id product_id user_id
1 2000 10
2 2001 10
5 2002 -1
6 2000 -1 <--- duplicate product, should be deleted
运行代码...
之后
cart_id product_id user_id
1 2000 10
2 2001 10
5 2002 10
6 2000 10 <--- not deleted
问题是这样的:
$update_cart = "UPDATE cart SET user_id='$userid' WHERE ip_address = '$ip_add' AND user_id = -1";
它正在更新与 user_id 和 ip_addr 匹配的所有行,然后在下一次传递时,搜索失败,因此它不会删除它应该删除的行。
$sql = "SELECT product_id FROM cart WHERE user_id = -1 AND ip_address = '$ip_add' ";
$stmt = $heidisql->query($sql);
while ($test = $stmt->fetch(PDO::FETCH_ASSOC)) {
$product_list = $test['product_id'];
$verify_cart_count = "SELECT COUNT(cart_id) FROM cart WHERE user_id= '$userid' AND product_id = $product_list";
$verify_cart_row = $heidisql->query($verify_cart_count);
$data_exists = $verify_cart_row->fetchColumn();
echo "Looking for data user_id = {$userid}, product_id = {$product_list}\n";
// echo $data_exists; exit();
if ($data_exists < 1) {
echo "Data exists\n";
//if result = 0, userid will be updated
// Bad
// $update_cart = "UPDATE cart SET user_id='$userid' WHERE ip_address = '$ip_add' AND user_id = -1";
// Fixed
$update_cart = "UPDATE cart SET user_id='$userid' WHERE ip_address = '$ip_add' AND user_id = -1 AND product_id = $product_list";
$update_cart_result = $heidisql->prepare($update_cart);
$update_cart_result->execute();
} else {
echo "Data missing\n";
//if result > 0, duplicate row need to be delete
$remove_exist_product = "DELETE FROM cart WHERE user_id = -1 AND ip_address= '$ip_add' AND product_id = $product_list ";
$remove_cart_result = $heidisql->prepare($remove_exist_product)->execute();
}
}
关于php - 在用户未登录然后登录的情况下,将重复数据放入购物车很困难,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48550304/