当前位置:首页 > PHP

PHP中下单功能实现

2026-01-29 06:01:50PHP

PHP下单功能实现步骤

数据库设计

创建订单表(orders)和订单详情表(order_items)是基础。orders表包含订单ID、用户ID、总金额、状态等字段;order_items表包含商品ID、订单ID、数量、单价等。

CREATE TABLE orders (
    id INT AUTO_INCREMENT PRIMARY KEY,
    user_id INT NOT NULL,
    total DECIMAL(10,2) NOT NULL,
    status VARCHAR(20) DEFAULT 'pending',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE order_items (
    id INT AUTO_INCREMENT PRIMARY KEY,
    order_id INT NOT NULL,
    product_id INT NOT NULL,
    quantity INT NOT NULL,
    price DECIMAL(10,2) NOT NULL
);

表单处理

前端提交订单数据通常通过POST请求。需要验证用户输入并过滤数据防止SQL注入。

PHP中下单功能实现

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    $userId = filter_input(INPUT_POST, 'user_id', FILTER_VALIDATE_INT);
    $products = $_POST['products']; // 数组形式 [['id'=>1, 'quantity'=>2], ...]

    if (!$userId || empty($products)) {
        die('Invalid input');
    }
}

事务处理

使用数据库事务确保订单和订单详情同时成功或失败。

try {
    $pdo->beginTransaction();

    // 计算总金额
    $total = 0;
    foreach ($products as $product) {
        $stmt = $pdo->prepare("SELECT price FROM products WHERE id = ?");
        $stmt->execute([$product['id']]);
        $productData = $stmt->fetch();
        $total += $productData['price'] * $product['quantity'];
    }

    // 插入订单
    $stmt = $pdo->prepare("INSERT INTO orders (user_id, total) VALUES (?, ?)");
    $stmt->execute([$userId, $total]);
    $orderId = $pdo->lastInsertId();

    // 插入订单详情
    foreach ($products as $product) {
        $stmt = $pdo->prepare("SELECT price FROM products WHERE id = ?");
        $stmt->execute([$product['id']]);
        $productData = $stmt->fetch();

        $stmt = $pdo->prepare("INSERT INTO order_items (order_id, product_id, quantity, price) VALUES (?, ?, ?, ?)");
        $stmt->execute([$orderId, $product['id'], $product['quantity'], $productData['price']]);
    }

    $pdo->commit();
    echo "Order created successfully!";
} catch (Exception $e) {
    $pdo->rollBack();
    echo "Error: " . $e->getMessage();
}

库存更新

下单后需要更新商品库存,避免超卖。

PHP中下单功能实现

foreach ($products as $product) {
    $stmt = $pdo->prepare("UPDATE products SET stock = stock - ? WHERE id = ? AND stock >= ?");
    $stmt->execute([$product['quantity'], $product['id'], $product['quantity']]);

    if ($stmt->rowCount() == 0) {
        throw new Exception("Insufficient stock for product ID: " . $product['id']);
    }
}

订单状态管理

实现订单状态变更功能,如支付、发货、完成等。

function updateOrderStatus($orderId, $status) {
    $allowedStatuses = ['pending', 'paid', 'shipped', 'completed', 'cancelled'];

    if (!in_array($status, $allowedStatuses)) {
        throw new InvalidArgumentException("Invalid status");
    }

    $stmt = $pdo->prepare("UPDATE orders SET status = ? WHERE id = ?");
    $stmt->execute([$status, $orderId]);

    return $stmt->rowCount() > 0;
}

安全措施

实施CSRF防护和输入验证。

session_start();

// 生成CSRF令牌
if (empty($_SESSION['csrf_token'])) {
    $_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}

// 验证CSRF令牌
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    if (!hash_equals($_SESSION['csrf_token'], $_POST['csrf_token'])) {
        die('CSRF token validation failed');
    }
}

标签: 下单功能
分享给朋友:

相关文章

vue实现倍速播放功能

vue实现倍速播放功能

实现倍速播放功能的方法 在Vue中实现倍速播放功能通常涉及HTML5的<video>元素或第三方播放器库(如video.js)的API调用。以下是具体实现方式: 使用原生HTML5 vi…

vue功能实现

vue功能实现

Vue 功能实现指南 Vue.js 是一个流行的前端框架,用于构建用户界面和单页应用。以下是 Vue 功能实现的关键方法和技术。 数据绑定与响应式 Vue 的核心特性是数据绑定和响应式系统。通过 d…

php登陆功能实现

php登陆功能实现

实现PHP登录功能 数据库准备 创建一个用户表存储登录信息,基本字段包括用户名、密码(需加密)等: CREATE TABLE users ( id INT AUTO_INCREMENT PR…

vue实现注册功能

vue实现注册功能

前端实现注册功能 在Vue中实现注册功能通常需要结合表单验证、HTTP请求和状态管理。以下是一个基于Vue 3和Element Plus的完整实现方案: 模板部分 <template>…

vue 实现单选功能

vue 实现单选功能

实现单选功能的方法 在Vue中实现单选功能可以通过多种方式完成,以下是几种常见的方法: 使用原生HTML单选按钮 通过v-model绑定数据,结合原生<input type="radio"&g…

vue各种功能实现

vue各种功能实现

Vue 基础功能实现 数据绑定与响应式更新 使用 v-model 实现表单元素与数据的双向绑定,数据变更自动更新视图。 示例: <input v-model="message"> &…