咨询表单下拉框联动问题:按医生出诊日禁用不符日期选项
修正后的fetch.php代码
<?php // 建立数据库连接,采用面向对象方式更易维护 $koneksi = new mysqli('localhost', 'root', '', 'simklinik'); // 检查数据库连接状态 if ($koneksi->connect_error) { die("连接失败: " . $koneksi->connect_error); } // 处理POST参数,避免未定义索引错误 $id = isset($_POST['id']) ? intval($_POST['id']) : 0; // 使用预处理语句防范SQL注入 $sql = "SELECT hari_praktek FROM jadwal_praktek WHERE dokter_id = ?"; $stmt = $koneksi->prepare($sql); $stmt->bind_param("i", $id); $stmt->execute(); $result = $stmt->get_result(); // 将医生的出诊日存入数组,统一为英文星期格式(匹配date('l')输出) $availableDays = []; while ($row = $result->fetch_assoc()) { $availableDays[] = $row['hari_praktek']; } $out = ''; // 生成未来21天的日期选项 for ($day = 0; $day < 21; $day++) { $timestamp = strtotime("+$day days"); $currentDate = date('Y-m-d', $timestamp); // 表单提交时的实际日期值 $displayDate = date('l d F Y', $timestamp); // 展示给用户的日期格式 $currentDay = date('l', $timestamp); // 当前日期对应的星期 // 判断当前日期是否在医生出诊范围内 $isDisabled = !in_array($currentDay, $availableDays) ? 'disabled="disabled"' : ''; // 拼接option标签,确保引号使用正确 $out .= "<option value='$currentDate' $isDisabled>$displayDate</option>"; } echo $out; // 关闭预处理语句和数据库连接 $stmt->close(); $koneksi->close(); ?>
关键修正点说明
- 正确获取出诊日列表:原代码直接操作查询结果集,需通过循环将所有出诊日存入数组,才能用
in_array判断日期是否匹配。 - 修复语法错误:原代码中
$date = date('l', $day)缺少分号,导致PHP解析失败。 - 修正字符串拼接:原代码的HTML标签拼接存在引号混乱问题,调整后确保option标签的属性和值输出正确。
- 防范SQL注入:替换直接拼接SQL的写法,使用mysqli预处理语句,避免恶意参数攻击。
- 优化日期存储:将option的
value改为Y-m-d格式的具体日期,而非星期几,方便后续表单提交后处理实际日期。 - 增加错误处理:添加数据库连接检查,避免连接失败导致的白屏;处理
$_POST['id']未定义的情况。
额外适配提示
如果数据库中hari_praktek字段存储的是印尼语星期(如Senin对应Monday),需要添加星期转换逻辑,示例:
$dayMap = [ 'Senin' => 'Monday', 'Selasa' => 'Tuesday', 'Rabu' => 'Wednesday', 'Kamis' => 'Thursday', 'Jumat' => 'Friday', 'Sabtu' => 'Saturday', 'Minggu' => 'Sunday' ]; $availableDays[] = $dayMap[$row['hari_praktek']];
内容的提问来源于stack exchange,提问作者lovhazes
相关产品推荐
相关产品推荐

