当前位置:首页 > PHP

php 实现sku

2026-02-14 08:35:41PHP

PHP实现SKU功能

SKU(Stock Keeping Unit)是库存管理中的关键概念,用于唯一标识商品的不同属性组合。在电商系统中,实现SKU功能需要考虑属性组合、库存管理和价格计算等核心要素。

数据库设计

创建商品表、属性表和SKU表是基础结构:

CREATE TABLE products (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    description TEXT
);

CREATE TABLE attributes (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100) NOT NULL
);

CREATE TABLE attribute_values (
    id INT AUTO_INCREMENT PRIMARY KEY,
    attribute_id INT NOT NULL,
    value VARCHAR(100) NOT NULL,
    FOREIGN KEY (attribute_id) REFERENCES attributes(id)
);

CREATE TABLE skus (
    id INT AUTO_INCREMENT PRIMARY KEY,
    product_id INT NOT NULL,
    sku_code VARCHAR(50) UNIQUE NOT NULL,
    price DECIMAL(10,2) NOT NULL,
    stock INT NOT NULL DEFAULT 0,
    FOREIGN KEY (product_id) REFERENCES products(id)
);

CREATE TABLE sku_attribute_values (
    sku_id INT NOT NULL,
    attribute_value_id INT NOT NULL,
    PRIMARY KEY (sku_id, attribute_value_id),
    FOREIGN KEY (sku_id) REFERENCES skus(id),
    FOREIGN KEY (attribute_value_id) REFERENCES attribute_values(id)
);

生成SKU组合

使用递归方法生成所有可能的属性组合:

php 实现sku

function generateCombinations($arrays, $i = 0) {
    if (!isset($arrays[$i])) {
        return array();
    }
    if ($i == count($arrays) - 1) {
        return $arrays[$i];
    }

    $result = array();
    foreach ($arrays[$i] as $element) {
        foreach (generateCombinations($arrays, $i + 1) as $combination) {
            $result[] = array_merge(array($element), (array)$combination);
        }
    }

    return $result;
}

$colorOptions = ['红', '蓝', '绿'];
$sizeOptions = ['S', 'M', 'L'];
$combinations = generateCombinations([$colorOptions, $sizeOptions]);

SKU编码生成

根据属性组合生成唯一SKU编码:

function generateSkuCode($productId, $attributes) {
    $hash = md5($productId . implode('', $attributes));
    return substr(strtoupper($hash), 0, 8);
}

$productId = 123;
$skuCode = generateSkuCode($productId, ['红', 'M']);

数据库操作类

封装SKU相关的数据库操作:

php 实现sku

class SkuManager {
    private $db;

    public function __construct($dbConnection) {
        $this->db = $dbConnection;
    }

    public function createSku($productId, $attributes, $price, $stock) {
        $skuCode = $this->generateSkuCode($productId, $attributes);

        $stmt = $this->db->prepare("INSERT INTO skus (product_id, sku_code, price, stock) VALUES (?, ?, ?, ?)");
        $stmt->execute([$productId, $skuCode, $price, $stock]);
        $skuId = $this->db->lastInsertId();

        foreach ($attributes as $attrValueId) {
            $stmt = $this->db->prepare("INSERT INTO sku_attribute_values (sku_id, attribute_value_id) VALUES (?, ?)");
            $stmt->execute([$skuId, $attrValueId]);
        }

        return $skuId;
    }

    public function getSkusByProduct($productId) {
        $stmt = $this->db->prepare("
            SELECT s.*, GROUP_CONCAT(av.value SEPARATOR ', ') AS attributes 
            FROM skus s
            JOIN sku_attribute_values sav ON s.id = sav.sku_id
            JOIN attribute_values av ON sav.attribute_value_id = av.id
            WHERE s.product_id = ?
            GROUP BY s.id
        ");
        $stmt->execute([$productId]);
        return $stmt->fetchAll(PDO::FETCH_ASSOC);
    }
}

前端交互处理

接收前端提交的SKU数据并处理:

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $productId = $_POST['product_id'];
    $skusData = json_decode($_POST['skus'], true);

    $skuManager = new SkuManager($db);

    foreach ($skusData as $sku) {
        $skuManager->createSku(
            $productId,
            $sku['attributes'],
            $sku['price'],
            $sku['stock']
        );
    }

    header('Content-Type: application/json');
    echo json_encode(['success' => true]);
    exit;
}

库存更新方法

实现SKU库存的增减操作:

public function updateStock($skuId, $quantity, $operation = 'add') {
    $operator = $operation === 'add' ? '+' : '-';
    $stmt = $this->db->prepare("UPDATE skus SET stock = stock $operator ? WHERE id = ?");
    return $stmt->execute([$quantity, $skuId]);
}

价格计算策略

根据不同的业务需求实现价格计算:

public function calculatePrice($skuId, $quantity, $discountRules = []) {
    $stmt = $this->db->prepare("SELECT price FROM skus WHERE id = ?");
    $stmt->execute([$skuId]);
    $basePrice = $stmt->fetchColumn();

    $finalPrice = $basePrice;

    foreach ($discountRules as $rule) {
        if ($quantity >= $rule['min_quantity']) {
            $finalPrice = $basePrice * (1 - $rule['discount']);
            break;
        }
    }

    return $finalPrice * $quantity;
}

注意事项

  1. 确保SKU编码的唯一性,避免重复
  2. 处理属性组合时需要验证有效性
  3. 库存操作需要添加事务处理保证数据一致性
  4. 考虑性能问题,特别是当属性组合较多时
  5. 实现适当的缓存机制减少数据库查询

通过以上方法可以实现完整的SKU管理系统,包括生成、存储、查询和更新等核心功能。实际应用中可根据具体需求进行调整和扩展。

标签: phpsku
分享给朋友:

相关文章

php如何实现直播

php如何实现直播

实现直播功能的方法 PHP可以通过结合其他技术和工具来实现直播功能。以下是几种常见的方法: 使用流媒体服务器 配置流媒体服务器如Nginx-RTMP、Red5或Wowza。这些服务器支持RTMP协…

php实现即时通讯

php实现即时通讯

PHP 实现即时通讯的方案 即时通讯(IM)可以通过多种方式实现,PHP 作为服务器端语言,通常需要结合前端技术(如 WebSocket、AJAX)或第三方服务来实现实时通信。以下是几种常见的实现方式…

php 队列的实现

php 队列的实现

PHP 队列的实现方法 使用数据库实现队列 创建一个数据表存储队列任务,包含任务ID、状态、创建时间等字段。通过SQL语句实现任务的入队和出队操作。 // 入队操作 INSERT INTO queu…

php实现过程

php实现过程

PHP 实现过程 PHP 是一种广泛使用的服务器端脚本语言,特别适合 Web 开发。以下是 PHP 实现过程的关键步骤和注意事项。 安装与配置 下载并安装 PHP,可以从官方 PHP 网站获取最新版…

php实现评论功能

php实现评论功能

数据库设计 创建评论表(示例结构): CREATE TABLE `comments` ( `id` int(11) NOT NULL AUTO_INCREMENT, `user_id`…

php发帖实现

php发帖实现

PHP 发帖实现方法 数据库准备 创建一个数据库表用于存储帖子信息,常见的字段包括帖子ID、标题、内容、作者、发布时间等。SQL示例: CREATE TABLE posts ( id INT…