php - 在用户未登录然后登录的情况下,将重复数据放入购物车很困难

标签 php mysql loops

数据库

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/

相关文章:

mysql - 分页和并发更新

python - 如何在 Numpy 中迭代一维数组并构建二维数组?

php - 接受包含多点系统的值

php - 联系表未发送

javascript - 我有表格,我想将表格数据导出到 Excel 中

mysql - 带前导零和可选小数点的数字 (sql)

php - Magento2 knockout 渲染特定子项

php - 准备好的 PHP SQL 语句在没有 GROUP BY 子句的情况下返回 false

javascript - 使用对象 javascript 在对象数组中搜索

c - 哪个代码在 C 中执行得更快?