php实现订单批量发货
PHP实现订单批量发货的方法
数据库设计
确保订单表包含必要的字段如订单ID、订单状态、物流公司、物流单号等。示例表结构如下:
CREATE TABLE `orders` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`order_no` varchar(50) NOT NULL,
`status` tinyint(1) DEFAULT 0 COMMENT '0未发货,1已发货',
`express_company` varchar(100) DEFAULT NULL,
`express_no` varchar(50) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
前端表单设计
创建批量发货表单页面,允许选择多个订单并填写物流信息:
<form action="batch_ship.php" method="post">
<table>
<tr>
<th>选择</th>
<th>订单号</th>
</tr>
<?php foreach($orders as $order): ?>
<tr>
<td><input type="checkbox" name="order_ids[]" value="<?=$order['id']?>"></td>
<td><?=$order['order_no']?></td>
</tr>
<?php endforeach; ?>
</table>
<div>
<label>物流公司:</label>
<select name="express_company">
<option value="顺丰">顺丰</option>
<option value="中通">中通</option>
</select>
</div>
<div>
<label>物流单号:</label>
<input type="text" name="express_no">
</div>
<button type="submit">批量发货</button>
</form>
后端处理逻辑
创建batch_ship.php处理批量发货请求:
<?php
// 连接数据库
$db = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
// 获取表单数据
$orderIds = $_POST['order_ids'] ?? [];
$expressCompany = $_POST['express_company'] ?? '';
$expressNo = $_POST['express_no'] ?? '';
if(empty($orderIds) || empty($expressCompany) || empty($expressNo)) {
die('请填写完整信息');
}
// 开启事务
$db->beginTransaction();
try {
// 准备更新语句
$stmt = $db->prepare("UPDATE orders SET status=1, express_company=?, express_no=? WHERE id=?");
// 批量更新每个订单
foreach($orderIds as $orderId) {
$stmt->execute([$expressCompany, $expressNo, $orderId]);
}
// 提交事务
$db->commit();
echo '批量发货成功';
} catch(Exception $e) {
// 回滚事务
$db->rollBack();
echo '发货失败: '.$e->getMessage();
}
?>
优化建议
为提升用户体验和系统稳定性,可考虑以下优化措施:
添加订单过滤功能,只显示待发货订单 实现物流公司API对接,自动填充物流单号 增加操作日志记录,记录每次批量发货的详情 添加CSRF防护措施,防止表单重复提交 对大数据量订单采用分批次处理,避免超时
错误处理
完善错误处理机制,包括: 验证物流单号格式是否正确 检查订单是否已发货 处理数据库连接失败情况 记录失败订单信息,便于重试







