当前位置:首页 > 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 实现文件下载的方法 使用 header() 函数强制下载 设置正确的 HTTP 头信息,强制浏览器下载文件而不是直接打开。 $file = 'path/to/file.pdf'; if (f…

php实现文件下载

php实现文件下载

PHP实现文件下载的方法 通过PHP实现文件下载功能,可以采用多种方式,以下是几种常见的实现方法: 使用header()函数强制下载 设置HTTP头信息,强制浏览器下载文件而非直接打开:…

php实现定时任务

php实现定时任务

PHP 实现定时任务的几种方法 在 PHP 中实现定时任务可以通过多种方式完成,具体选择取决于项目需求和服务器环境。以下是常见的实现方法: 使用 Cron 任务 Cron 是 Linux 系统中常用…

php实现

php实现

PHP 实现的基本方法 PHP 是一种服务器端脚本语言,广泛用于 Web 开发。以下是 PHP 实现的一些常见方法。 变量与数据类型 PHP 变量以 $ 开头,支持多种数据类型: $nam…

php实现登录

php实现登录

PHP 登录功能实现 数据库连接与用户表创建 创建一个数据库连接文件 db.php,用于管理数据库连接。MySQL 示例代码如下: <?php $host = 'localhost'; $d…

php实现异步

php实现异步

PHP 实现异步的方法 PHP 本身是同步执行的脚本语言,但可以通过以下方法模拟异步操作或实现异步效果: 使用多进程(pcntl_fork) 通过 pcntl_fork 创建子进程实现异步,适用于…