位置: 文档库 > PHP > 文档下载预览

《PHP商城开发中如何处理SKU商品的增、删、改、查.doc》

1. 下载的文档为doc格式,下载后可用word或者wps进行编辑;

2. 将本文以doc文档格式下载到电脑,方便收藏和打印;

3. 下载后的文档,内容与下面显示的完全一致,下载之前请确认下面内容是否您想要的,是否完整.

点击下载文档

PHP商城开发中如何处理SKU商品的增、删、改、查.doc

《PHP商城开发中如何处理SKU商品的增、删、改、查》

在电商系统的开发中,SKU(Stock Keeping Unit,库存量单位)管理是核心功能之一。它通过组合商品属性(如颜色、尺寸、版本等)生成唯一标识,帮助商家精准管理库存、定价和销售策略。本文将围绕PHP商城开发中SKU商品的增、删、改、查(CRUD)操作展开,从数据库设计到业务逻辑实现,结合代码示例详细讲解。

一、SKU管理的核心概念

SKU的本质是商品属性的组合。例如,一件T恤可能有“颜色:红色、尺寸:M”和“颜色:蓝色、尺寸:L”两种SKU,对应不同的库存和价格。在数据库中,SKU通常以主表(商品基本信息)和子表(SKU属性及库存)的形式存储。

二、数据库设计

合理的数据库设计是SKU管理的基础。以下是一个典型的表结构示例:

1. 商品主表(products)

CREATE TABLE `products` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(100) NOT NULL COMMENT '商品名称',
  `category_id` int(11) NOT NULL COMMENT '分类ID',
  `base_price` decimal(10,2) NOT NULL COMMENT '基础价格',
  `created_at` datetime NOT NULL,
  `updated_at` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

2. SKU属性表(product_attributes)

存储商品支持的属性(如颜色、尺寸)。

CREATE TABLE `product_attributes` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `product_id` int(11) NOT NULL COMMENT '商品ID',
  `attribute_name` varchar(50) NOT NULL COMMENT '属性名(如颜色)',
  `attribute_values` text COMMENT '属性值(JSON数组)',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

3. SKU表(skus)

存储具体的SKU信息,包括属性组合、库存、价格等。

CREATE TABLE `skus` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `product_id` int(11) NOT NULL COMMENT '商品ID',
  `sku_code` varchar(50) NOT NULL COMMENT 'SKU编码',
  `attributes` text NOT NULL COMMENT '属性组合(JSON)',
  `price` decimal(10,2) NOT NULL COMMENT 'SKU价格',
  `stock` int(11) NOT NULL DEFAULT '0' COMMENT '库存',
  `created_at` datetime NOT NULL,
  `updated_at` datetime NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `sku_code` (`sku_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

三、SKU的增删改查实现

1. 添加SKU(Create)

添加SKU时需处理属性组合并生成唯一SKU编码。示例代码如下:

class SkuService {
    public function addSku($productId, $attributes, $price, $stock) {
        // 生成SKU编码(示例:商品ID+属性哈希)
        $attributeHash = md5(json_encode($attributes));
        $skuCode = 'SKU_' . $productId . '_' . $attributeHash;

        // 检查SKU是否已存在
        $existingSku = $this->getSkuByCode($skuCode);
        if ($existingSku) {
            throw new Exception('SKU已存在');
        }

        // 插入SKU数据
        $db = new PDO('mysql:host=localhost;dbname=mall', 'user', 'pass');
        $stmt = $db->prepare("INSERT INTO skus (product_id, sku_code, attributes, price, stock, created_at) VALUES (?, ?, ?, ?, ?, NOW())");
        $stmt->execute([
            $productId,
            $skuCode,
            json_encode($attributes),
            $price,
            $stock
        ]);

        return $db->lastInsertId();
    }

    private function getSkuByCode($skuCode) {
        $db = new PDO('mysql:host=localhost;dbname=mall', 'user', 'pass');
        $stmt = $db->prepare("SELECT * FROM skus WHERE sku_code = ?");
        $stmt->execute([$skuCode]);
        return $stmt->fetch(PDO::FETCH_ASSOC);
    }
}

2. 查询SKU(Read)

查询SKU通常包括按商品ID获取所有SKU、按属性筛选SKU等场景。

class SkuService {
    // 按商品ID获取所有SKU
    public function getSkusByProductId($productId) {
        $db = new PDO('mysql:host=localhost;dbname=mall', 'user', 'pass');
        $stmt = $db->prepare("SELECT * FROM skus WHERE product_id = ? ORDER BY created_at DESC");
        $stmt->execute([$productId]);
        $skus = $stmt->fetchAll(PDO::FETCH_ASSOC);

        // 解析JSON属性
        foreach ($skus as &$sku) {
            $sku['attributes'] = json_decode($sku['attributes'], true);
        }
        return $skus;
    }

    // 按属性筛选SKU(示例:查询红色M码的T恤)
    public function getSkusByAttributes($productId, $filters) {
        $db = new PDO('mysql:host=localhost;dbname=mall', 'user', 'pass');
        $skus = [];
        $allSkus = $this->getSkusByProductId($productId);

        foreach ($allSkus as $sku) {
            $attributes = $sku['attributes'];
            $match = true;
            foreach ($filters as $key => $value) {
                if (!isset($attributes[$key]) || $attributes[$key] != $value) {
                    $match = false;
                    break;
                }
            }
            if ($match) {
                $skus[] = $sku;
            }
        }
        return $skus;
    }
}

3. 更新SKU(Update)

更新SKU时需注意并发控制和数据一致性。

class SkuService {
    public function updateSku($skuId, $price, $stock) {
        $db = new PDO('mysql:host=localhost;dbname=mall', 'user', 'pass');
        $stmt = $db->prepare("UPDATE skus SET price = ?, stock = ?, updated_at = NOW() WHERE id = ?");
        $affected = $stmt->execute([$price, $stock, $skuId]);

        if ($affected === false) {
            throw new Exception('更新失败');
        }
        return true;
    }

    // 批量更新库存(减库存示例)
    public function reduceStock($skuId, $quantity) {
        $db = new PDO('mysql:host=localhost;dbname=mall', 'user', 'pass');
        $db->beginTransaction();
        try {
            $stmt = $db->prepare("UPDATE skus SET stock = stock - ? WHERE id = ? AND stock >= ?");
            $affected = $stmt->execute([$quantity, $skuId, $quantity]);

            if ($affected === false || $stmt->rowCount() === 0) {
                $db->rollBack();
                throw new Exception('库存不足或更新失败');
            }
            $db->commit();
            return true;
        } catch (Exception $e) {
            $db->rollBack();
            throw $e;
        }
    }
}

4. 删除SKU(Delete)

删除SKU需检查关联数据(如订单、促销活动)。

class SkuService {
    public function deleteSku($skuId) {
        // 检查是否有关联订单(伪代码)
        $orderItems = $this->getOrderItemsBySkuId($skuId);
        if (!empty($orderItems)) {
            throw new Exception('该SKU存在关联订单,无法删除');
        }

        $db = new PDO('mysql:host=localhost;dbname=mall', 'user', 'pass');
        $stmt = $db->prepare("DELETE FROM skus WHERE id = ?");
        $affected = $stmt->execute([$skuId]);

        if ($affected === false) {
            throw new Exception('删除失败');
        }
        return true;
    }

    private function getOrderItemsBySkuId($skuId) {
        // 实际开发中需查询订单表
        return [];
    }
}

四、高级功能扩展

1. 属性模板管理

为减少重复操作,可设计属性模板。例如,所有T恤共享“颜色、尺寸”属性模板。

CREATE TABLE `attribute_templates` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL COMMENT '模板名称',
  `attributes` text NOT NULL COMMENT '属性列表(JSON)',
  PRIMARY KEY (`id`)
);

2. 动态表单生成

根据属性模板动态生成前端表单,提升用户体验。

class AttributeService {
    public function getTemplateAttributes($templateId) {
        $db = new PDO('mysql:host=localhost;dbname=mall', 'user', 'pass');
        $stmt = $db->prepare("SELECT attributes FROM attribute_templates WHERE id = ?");
        $stmt->execute([$templateId]);
        $template = $stmt->fetch(PDO::FETCH_ASSOC);
        return json_decode($template['attributes'], true) ?: [];
    }
}

3. 库存预警

通过定时任务检查低库存SKU并发送通知。

class StockAlertService {
    public function checkLowStock() {
        $db = new PDO('mysql:host=localhost;dbname=mall', 'user', 'pass');
        $stmt = $db->prepare("SELECT * FROM skus WHERE stock execute([10]); // 预警阈值
        $lowStockSkus = $stmt->fetchAll(PDO::FETCH_ASSOC);

        foreach ($lowStockSkus as $sku) {
            $this->sendAlert($sku);
        }
    }

    private function sendAlert($sku) {
        // 发送邮件或短信逻辑
    }
}

五、性能优化建议

1. 数据库索引优化:为`product_id`、`sku_code`等字段添加索引。

2. 缓存策略:使用Redis缓存热门SKU数据。

3. 批量操作:支持批量更新库存(如`UPDATE skus SET stock = stock - 1 WHERE id IN (1,2,3)`)。

4. 异步处理:高并发场景下使用消息队列(如RabbitMQ)处理库存变更。

六、安全注意事项

1. 参数校验:防止SQL注入(使用PDO预处理语句)。

2. 权限控制:确保只有管理员可操作SKU。

3. 数据备份:定期备份SKU数据,防止误删除。

关键词:PHP商城开发、SKU管理、数据库设计、CRUD操作、属性组合、库存预警、性能优化

简介:本文详细讲解PHP商城开发中SKU商品的增删改查实现,涵盖数据库设计、核心代码示例、高级功能扩展及性能优化建议,帮助开发者构建高效稳定的SKU管理系统。

《PHP商城开发中如何处理SKU商品的增、删、改、查.doc》
将本文以doc文档格式下载到电脑,方便收藏和打印
推荐度:
点击下载文档