PHP开发租车网站:如何整合车辆与预订详情实现提交入库可查
PHP+MySQL租车系统车辆详情与预订数据关联存储实现方案
1. 先搭建带关联关系的数据库表结构
数据关联的核心是靠外键绑定车辆和预订记录,先在phpMyAdmin里执行以下SQL建两张核心表:
-- 车辆产品详情表,存所有车辆的固定信息 CREATE TABLE `vehicles` ( `vehicle_id` int UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '车辆唯一ID', `vehicle_name` varchar(100) NOT NULL COMMENT '车型名称', `brand` varchar(50) NOT NULL COMMENT '品牌', `price_per_day` decimal(10,2) NOT NULL COMMENT '日租金', `seat_count` tinyint NOT NULL COMMENT '座位数', `gear_type` varchar(20) NOT NULL COMMENT '变速箱类型', `status` tinyint NOT NULL DEFAULT '1' COMMENT '1=可租 2=已租 3=维护中' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 预订记录表,存用户提交的表单数据,通过vehicle_id关联车辆表 CREATE TABLE `bookings` ( `booking_id` int UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '预订记录ID', `vehicle_id` int UNSIGNED NOT NULL COMMENT '关联的车辆ID', `user_name` varchar(50) NOT NULL COMMENT '预订人姓名', `user_phone` varchar(20) NOT NULL COMMENT '预订人手机号', `pickup_date` date NOT NULL COMMENT '取车日期', `return_date` date NOT NULL COMMENT '还车日期', `total_fee` decimal(10,2) NOT NULL COMMENT '订单总金额', `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '提交时间', FOREIGN KEY (`vehicle_id`) REFERENCES `vehicles`(`vehicle_id`) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
建表时必须选InnoDB引擎,才能支持外键约束,避免出现预订记录关联不存在的车辆的脏数据。
2. 车辆详情页绑定关联ID
用户访问单辆车的详情页时,URL需要携带对应车辆ID,比如car_detail.php?id=2,页面逻辑分两部分:
- 接收URL中的id参数,查询vehicles表中对应ID的车辆数据,渲染车辆详情(价格、配置、图片等)
- 页面内的预订表单加一个隐藏输入框,把当前车辆ID存进去,提交表单时会自动把这个ID一起传给后端,示例表单代码:
<!-- 先在页面顶部查询到当前车辆数据存到$vehicle变量 --> <form action="submit_booking.php" method="post"> <!-- 隐藏域绑定车辆ID,用户不可见,提交时自动传参 --> <input type="hidden" name="vehicle_id" value="<?php echo (int)$vehicle['vehicle_id']; ?>"> <div> <label>姓名:</label> <input type="text" name="user_name" required> </div> <div> <label>手机号:</label> <input type="tel" name="user_phone" required> </div> <div> <label>取车日期:</label> <input type="date" name="pickup_date" required> </div> <div> <label>还车日期:</label> <input type="date" name="return_date" required> </div> <button type="submit">提交预订</button> </form>
3. 后端接收表单数据入库
新建submit_booking.php文件处理表单提交,用PDO做预处理语句防SQL注入,不要直接拼接用户输入的参数到SQL里,示例代码:
<?php // 连接数据库 $pdo = new PDO('mysql:host=localhost;dbname=你的数据库名;charset=utf8mb4', '数据库账号', '数据库密码'); // 接收并校验参数 $vehicle_id = (int)$_POST['vehicle_id']; $user_name = trim($_POST['user_name']); $user_phone = trim($_POST['user_phone']); $pickup_date = trim($_POST['pickup_date']); $return_date = trim($_POST['return_date']); // 基础校验 if ($vehicle_id <=0 || empty($user_name) || empty($user_phone) || strtotime($pickup_date) >= strtotime($return_date)) { exit("提交参数不合法,请检查后重新提交"); } // 校验关联的车辆是否存在且可租 $checkCar = $pdo->prepare("SELECT vehicle_id, price_per_day, status FROM vehicles WHERE vehicle_id = ?"); $checkCar->execute([$vehicle_id]); $car = $checkCar->fetch(PDO::FETCH_ASSOC); if (!$car || $car['status'] != 1) { exit("所选车辆暂不可租"); } // 计算总租金 $days = (strtotime($return_date) - strtotime($pickup_date)) / 86400; $total_fee = $days * $car['price_per_day']; // 插入预订记录 $insert = $pdo->prepare("INSERT INTO bookings (vehicle_id, user_name, user_phone, pickup_date, return_date, total_fee) VALUES (?, ?, ?, ?, ?, ?)"); $insertResult = $insert->execute([$vehicle_id, $user_name, $user_phone, $pickup_date, $return_date, $total_fee]); if ($insertResult) { // 插入成功可以跳转到预订成功页 header("Location: booking_success.php"); exit; } else { exit("预订提交失败,请稍后重试"); } ?>
4. phpMyAdmin查看关联数据
代码逻辑跑通后,用户提交的预订数据会自动存入bookings表:
- 直接点phpMyAdmin左侧对应数据库下的
bookings表,就能看到所有用户提交的预订记录 - 如果要同时查看每条预订对应的车辆详情,在phpMyAdmin的SQL查询页执行关联查询语句即可:
SELECT b.*, v.vehicle_name, v.brand, v.price_per_day FROM bookings b LEFT JOIN vehicles v ON b.vehicle_id = v.vehicle_id ORDER BY b.create_time DESC
注意:所有用户传入的参数必须做类型校验和格式校验,比如手机号正则、日期合法性校验,不要信任任何前端传过来的数据;高并发场景下需要加事务处理,避免同一辆车被重复预订。
内容的提问来源于stack exchange,提问作者Navya Mariam Babu
相关产品推荐
相关产品推荐

