使用MySQL制作购物车表的更好方法是什么?

时间:2018-03-13 07:56:53

标签: php mysql

所以我创建了一个名为'cart'的数据库表,我原本打算通过'cartID'使其更容易,当用户将另一个项目添加到购物车时,其中一个字段会自动递增。但是,我意识到,随着为单个购物车添加更多项目,我必然会有这么多行记录。有没有更简单的方法来显示一个购物车的信息?

以下是我的'购物车'表的示例大纲:

cartID | memberID | itemID | shopID | cartQuant | cartDetail |     added
------------------------------------------------------------------------
     1 |        1 |      1 |      1 |        13 |   Size: XS | 3/12/2018
     2 |        1 |      2 |      1 |         2 |   Size: XL | 3/12/2018
...

正如您所看到的,'cartID'包含由'memberID'为1添加到购物车的商品。但是,如果'cartID'就像我在''交易'上的'orderID'那样会更好'表,以便订单知道它正在查看哪个购物车。此外,'shopID'可以更好地定位项目(如排序),以便我首先显示所有'shopID'。我用ORDER BY shopID做到了。

任何帮助将不胜感激,我只是在寻找一种更有效的方式来显示和组织购物车项目。

3 个答案:

答案 0 :(得分:0)

最近,我找到了在购物车上管理推车,客户和产品的最佳方法之一。

所以你需要5个表格。第一个表是您的客户表:

customerID | customerName | customerEmail | ....
-------------------------------------------------
INT (INCR) | VARCHAR(200) | VARCHAR (200) | ....

第二,你有商店的商店桌子:

shopID    | shopName | etc....
----------------------------
INT (INCR)| VARCHAR  | etc ....

然后您拥有包含所有可用产品的产品表:

productID | productName | ProductDescription | etc....
------------------------------------------------------
INT (INCR)| VARCHAR .   | TEXT               | etc...

购物车桌很短,但可以很容易地扩展,直到满足您的需求:

cartID    | customerID              | DatePlaced
------------------------------------------------
INT (INCR)| INT (From customerTable)| DATETIME

所以现在你并没有直接将产品添加到购物车表中,你需要一张包含购物车产品的表格。 CartDetail表:

cartDetailID   | cartID | shopID | productID | Quantity | dateAdd
----------------------------------------------------------------
INT (INCREMENT)| INT    | INT    | INT       | INT      | DATETIME

此处的cartID可以重复,您的表格如下所示:

 cartDetailID   | cartID | shopID | productID | Quantity | dateAdd
 ----------------------------------------------------------------
 0              | 15     | 1      | 253       | 3        | 2018-08-03 09:43:17
 1              | 15     | 1      | 255       | 1        | 2018-08-03 09:43:17

然后,您需要做的就是形成一个查询,将所有这些表绑定在一起并获取所有表的正确值。使这样的数据库为您提供足够的空间来扩展它,即使对于不同的语言和不同的商店也是如此。希望这有点帮助

答案 1 :(得分:0)

更简单(但有点复杂)的方法来减少您在购物车桌上的记录,重新调整结构如下:

cartID | memberID | cartDetail
---------------------------------------------------
1      | 1        | 1-1-13-Size: XS, 1-2-2-Size: XL

现在您只有1个cartID,而商品和商品详情(shopID,itemID,cartQuant,cartDetail)都属于该memberID。您需要做的就是尝试使用php中的explode()方法爆炸cartDetail的所有内容。

$SQL = "SELECT * FROM cart WHERE memberID = '$memberID'";
$result = mysqli_query($connect, $SQL);
$field = mysqli_fetch_assoc($result);
$cartID = $field['cartID'];
$cartDetail = $field['cartDetail'];
// check that cart and explode its contents to retrieve cart items based on ','
if($cartDetail != null || $cartDetail != "") {
    // if cart contains ','
    if(strpos($cartDetail, ',')) {
        $cartArray = explode(',', $cartDetail);
        $cartitems = sizeof($cartArray);
    }
    else {
        $cartArray = array();
        $cartArray[0] = $cartDetail;
        $cartitems = 1;
    }
}
else { $cartitems = 0; }

爆炸数组将打印出如下内容:

echo cartArray[0]; // 1-1-13-Size: XS
echo cartArray[1]; // 1-2-2-Size: XL

但是,您希望使用数组中每个元素的各个值。使用循环打印出较小阵列的爆炸内容。

// for loop here to go through every single element with i as counting
    $currentItem = explode('-', $cartArray[$i]);
    // 0 = shopID, 1 = itemID, 2 = cartQuant, 3 = cartDetail
    $shopID = $currentItem[0];
    $itemID = $currentItem[1];
    $cartQuant = $currentItem[2];
    $cartDetail = $currentItem[3];

你想立即显示它,因为它在该索引的循环中。

要显示购物车的内容,请使用explode()功能进行打印。如果您尝试将新项目添加到购物车,您将不需要该功能,您只需要使用SQL语句和查询从MySQL检索值,获取“cartDetail”并将其保存到临时字符串比如$tempStr。然后,您可以使用$tempStr = $tempStr."1-3-8-Size: M";将新元素添加到其中。

此外,我删除了您的“已添加”字段,以便您可以使用array_reverse()使用反向数组来显示附加到现有购物车的最新项目(您必须再次使用explode())。< / p>

答案 2 :(得分:0)

你应该使用数据库关系以使其完美

您需要为 user、products、cart、cart_items 创建一个表

每一个都与另一个有关系,意味着

  • “cart”表与“user”表有user_id关系
  • “cart_items”与“cart”表有cart_id关系
  • “cart_items”与“product”表有product_id关系

所以现在您可以使用cart_items表添加任意数量的产品,并将产品添加到购物车表中,并将其引用到购物车表中的哪个购物车,而购物车是指拥有它的用户。

决赛桌是这样的,

Cart Table

Cart_Item Table