PHP中如何编写条件判断指定医生的预约时段是否可用
预约时段校验逻辑不生效修复方案
核心问题清单
- 大小写拼写错误:代码中定义医生ID时用的是大写
$patient_obj->docId,但参数绑定处写成了小写$patient_obj->docid,PHP对象属性大小写敏感,此处会传入空值,无法查询到对应医生的已有预约记录,导致冲突判断永远不触发。 - 仅校验单条预约记录:使用
fetch()方法只会读取该医生的第一条预约记录,就算该医生存在多段已预约时段,也无法检测到和其他时段的冲突。 - 未处理空查询结果:如果对应医生暂无任何预约记录,
$data为布尔值false,直接执行extract($data)会抛出PHP警告,后续变量也未定义。 - 时间比较效率低:将时间戳转回字符串再比较,不如直接用时间戳整型比较高效,也能避免日期格式不统一导致的判断异常。
修复后代码
if($_POST){ $patient_obj->docId = $_POST['selectDr']; $patient_obj->appStart = $_POST['appStart']; $patient_obj->appEnd = $_POST['appEnd']; $patient_obj->patientId = $_POST['patientId']; // 直接转时间戳做比较,不用转回字符串 $startInputTimestamp = strtotime($patient_obj->appStart); $endInputTimestamp = strtotime($patient_obj->appEnd); $conflictFlag = false; $sql = "SELECT AppStart,AppEnd FROM appointments WHERE docID=?"; $stmt = $conn->prepare($sql); // 修正大小写,用正确的属性名docId $stmt->bindParam(1, $patient_obj->docId); $stmt->execute(); // 遍历该医生所有已有预约记录,逐个校验冲突 while($data = $stmt->fetch(PDO::FETCH_ASSOC)){ $startDbTimestamp = strtotime($data['AppStart']); $endDbTimestamp = strtotime($data['AppEnd']); // 时段冲突判断:新时段和已有时段存在重叠就算冲突 if(($startInputTimestamp >= $startDbTimestamp && $startInputTimestamp < $endDbTimestamp) || ($endInputTimestamp > $startDbTimestamp && $endInputTimestamp <= $endDbTimestamp) || ($startInputTimestamp <= $startDbTimestamp && $endInputTimestamp >= $endDbTimestamp)) { $conflictFlag = true; break; // 检测到冲突直接跳出循环 } } if($conflictFlag){ echo '<script>alert("change the appointment")</script>'; }else{ $patient_obj->addAppointment(); } }
补充说明
冲突判断逻辑本身是正确的,覆盖了三种重叠场景:新时段开头落在已有时段内、新时段结尾落在已有时段内、新时段完全包含已有时段,修复上述问题后即可正常触发校验。
内容的提问来源于stack exchange,提问作者oliver
相关产品推荐
相关产品推荐

