php 实现订单
PHP 实现订单系统的基本步骤
数据库设计 创建订单相关的数据表,通常包括订单表(orders)、订单详情表(order_items)、商品表(products)和用户表(users)。订单表应包含字段如订单ID、用户ID、订单状态、总金额、创建时间等。
CREATE TABLE orders (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT,
total_amount DECIMAL(10,2),
status VARCHAR(50),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE order_items (
id INT AUTO_INCREMENT PRIMARY KEY,
order_id INT,
product_id INT,
quantity INT,
price DECIMAL(10,2)
);
订单创建逻辑 处理用户提交的订单表单数据,验证商品库存和用户信息,将订单数据插入数据库。使用事务确保数据一致性。

// 示例代码
try {
$pdo->beginTransaction();
// 插入订单主表
$stmt = $pdo->prepare("INSERT INTO orders (user_id, total_amount, status) VALUES (?, ?, ?)");
$stmt->execute([$userId, $totalAmount, 'pending']);
$orderId = $pdo->lastInsertId();
// 插入订单明细
foreach ($cartItems as $item) {
$stmt = $pdo->prepare("INSERT INTO order_items (order_id, product_id, quantity, price) VALUES (?, ?, ?, ?)");
$stmt->execute([$orderId, $item['product_id'], $item['quantity'], $item['price']]);
}
$pdo->commit();
} catch (Exception $e) {
$pdo->rollBack();
// 错误处理
}
订单状态管理
状态流转设计 实现订单状态机,定义状态流转规则(如pending→paid→shipped→completed)。创建状态变更方法,确保状态转换符合业务逻辑。
public function updateOrderStatus($orderId, $newStatus) {
$currentStatus = $this->getCurrentStatus($orderId);
// 验证状态转换是否合法
if (!in_array($newStatus, $this->getAllowedTransitions($currentStatus))) {
throw new Exception("Invalid status transition");
}
// 更新状态
$stmt = $pdo->prepare("UPDATE orders SET status = ? WHERE id = ?");
$stmt->execute([$newStatus, $orderId]);
// 记录状态变更历史
$this->logStatusChange($orderId, $currentStatus, $newStatus);
}
支付集成
支付接口对接 集成第三方支付网关(如支付宝、微信支付、PayPal)。创建支付请求处理逻辑,处理支付回调通知。

// 发起支付请求示例
public function createPayment($orderId) {
$order = $this->getOrder($orderId);
$paymentGateway = new AlipayGateway();
$params = [
'out_trade_no' => $order['id'],
'total_amount' => $order['total_amount'],
'subject' => '订单支付'
];
return $paymentGateway->createPayment($params);
}
// 支付回调处理
public function handlePaymentCallback($data) {
if ($this->verifyCallback($data)) {
$orderId = $data['out_trade_no'];
$this->updateOrderStatus($orderId, 'paid');
return true;
}
return false;
}
订单查询与展示
列表与详情页实现 开发订单列表页面和详情页面,支持分页查询和多种筛选条件(按状态、时间范围等)。
// 获取用户订单列表
public function getUserOrders($userId, $page = 1, $perPage = 10) {
$offset = ($page - 1) * $perPage;
$stmt = $pdo->prepare("SELECT * FROM orders WHERE user_id = ? ORDER BY created_at DESC LIMIT ?, ?");
$stmt->execute([$userId, $offset, $perPage]);
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
// 获取订单详情
public function getOrderDetails($orderId) {
$order = $pdo->query("SELECT * FROM orders WHERE id = ?", [$orderId])->fetch();
$items = $pdo->query("SELECT * FROM order_items WHERE order_id = ?", [$orderId])->fetchAll();
return [
'order' => $order,
'items' => $items
];
}
库存管理
库存扣减逻辑 在订单创建时锁定库存,支付成功后实际扣减库存。实现库存回滚机制处理订单取消情况。
// 预扣库存
public function reserveInventory($productId, $quantity) {
$pdo->beginTransaction();
// 检查库存是否充足
$stmt = $pdo->prepare("SELECT stock FROM products WHERE id = ? FOR UPDATE");
$stmt->execute([$productId]);
$product = $stmt->fetch();
if ($product['stock'] < $quantity) {
$pdo->rollBack();
throw new Exception("Insufficient stock");
}
// 预扣库存
$stmt = $pdo->prepare("UPDATE products SET reserved_stock = reserved_stock + ? WHERE id = ?");
$stmt->execute([$quantity, $productId]);
$pdo->commit();
}
// 实际扣减库存(支付成功后)
public function deductInventory($productId, $quantity) {
$stmt = $pdo->prepare("UPDATE products SET stock = stock - ?, reserved_stock = reserved_stock - ? WHERE id = ?");
$stmt->execute([$quantity, $quantity, $productId]);
}






