PHP多房间排期系统同房间时间冲突校验SQL修复方案
多房间排期冲突校验优化方案
原有问题
- 排期冲突校验未增加房间维度过滤,不同房间的相同时段排期会被误判为冲突
- 原有时间段重叠判断逻辑不完整,未覆盖「新提交排期完全包含已有同房间排期」的冲突场景
- 原代码直接拼接用户输入参数到SQL语句,存在SQL注入安全隐患,建议后续升级为参数绑定的预处理写法
优化后冲突校验代码
首先确认表单提交的房间ID字段名(和schedule_list表中存储房间关联ID的字段对应,常见命名为room_id或assembly_hall_id),将校验SQL修改为如下内容:
// 替换为你实际的房间字段变量名,例如表单传assembly_hall_id则写$assembly_hall_id $current_room = $room_id; $d_start = strtotime($datetime_start); $d_end = strtotime($datetime_end); $chk = $this->conn->query("SELECT * FROM `schedule_list` WHERE -- 仅匹配同房间的排期记录 room_id = '{$current_room}' -- 覆盖所有时间段重叠场景 AND ( ('{$d_start}' BETWEEN unix_timestamp(datetime_start) AND unix_timestamp(datetime_end)) OR ('{$d_end}' BETWEEN unix_timestamp(datetime_start) AND unix_timestamp(datetime_end)) OR (unix_timestamp(datetime_start) BETWEEN '{$d_start}' AND '{$d_end}') ) ".(( $id > 0) ? " AND id != '{$id}' " : ""))->num_rows;
注意事项
如果你的schedule_list表中关联房间的字段名不是
room_id,将SQL中对应字段名替换为实际字段名即可,保证变量取值和表单提交的房间参数一致。
修改后校验逻辑只会对同一房间下的排期做时间段冲突判断,不同房间的相同时段排期可以正常提交,同时补全了之前漏判的重叠场景。
内容的提问来源于stack exchange,提问作者Jonjon Candare
相关产品推荐
相关产品推荐

