当前位置:首页 > 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注入。

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();
}

库存更新

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

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防护和输入验证。

PHP中下单功能实现

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中实现按钮点击功能可以通过v-on指令或@缩写来绑定事件。以下是几种常见的实现方式: 使用v-on指令 通过v-on:click绑定点击事件,触发定义在methods中的方…

vue实现tab功能

vue实现tab功能

Vue实现Tab功能的方法 使用动态组件和v-for指令 在Vue中实现Tab功能可以通过动态组件和v-for指令结合完成。定义一个包含tab标题和对应内容的数组,使用v-for渲染tab标题,并通过…

vue实现模态功能

vue实现模态功能

Vue 实现模态框功能 方法一:使用组件和v-if/v-show控制显示 创建独立的模态框组件(如Modal.vue),通过props接收标题、内容等数据,使用v-if或v-show控制显示状态。…

vue实现直播功能

vue实现直播功能

使用 Vue 实现直播功能 方案一:基于 WebRTC 实现实时直播 技术栈选择 Vue 3 + WebRTC (RTCPeerConnection) 信令服务器(可选 Socket.io) 媒体服…

vue实现计时功能

vue实现计时功能

使用 Vue 实现计时功能 在 Vue 中实现计时功能可以通过多种方式完成,以下是几种常见的实现方法。 使用 setInterval 实现基础计时器 通过 setInterval 创建一个计时器,并…

vue 实现拍照功能

vue 实现拍照功能

使用HTML5的getUserMedia API实现拍照 在Vue中实现拍照功能可以通过HTML5的getUserMedia API访问摄像头,结合canvas元素捕获图像。 安装依赖(如需处理图像…