You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CodeIgniter 4记录视图表单无法显示患者血型问题

问题:CodeIgniter 4 患者血型下拉框无法回显数据

在CodeIgniter 4框架开发患者记录编辑页面时,血型下拉选择框无法正确显示患者已有的血型数据,数据未被正确回显。

相关代码

视图文件(view.php)片段

<div class="form-group">
    <label for="blood_type_id">Blood type:</label>
    <select class="form-control" name="blood_type_id" disabled>
        <option <?= (old('blood_type_id') === null || old('blood_type_id') == '') ? 'selected' : '' ?> value=""><?= 'Choose the blood type' ?></option>
        <?php foreach ($blood_types as $id => $ts): ?>
            <option <?= (string) old('blood_type_id') === $id ? 'selected' : '' ?> value="<?= $id + 1?>"><?= $ts['description'] ?></option>
        <?php endforeach; ?>
    </select>
    <?php echo session()->getFlashdata('errors')["blood_type_id"] ?? ""; ?>
</div>

控制器文件(PacientController.php)片段

public function edit($id)
{
    $model = new PacientModel();
    $blood = new BloodTypeModel();
    $data = [
        'pacients' => $model->getPacient($id),
        'blood_types' => $blood->findAll(), 
    ];
    return view('pacient/edit', $data);
}

问题分析与修复方案

核心问题点

  1. 未使用患者当前数据回显:视图仅通过old()判断选中状态,但编辑页面初始加载时应优先使用数据库中患者的血型ID,而非仅依赖表单验证回显值。
  2. 错误使用数组索引作为血型ID:findAll()返回的是血型记录数组,循环中的$id是数组的索引(从0开始),并非血型表的实际ID字段,导致选中判断和value值错误。
  3. value值计算错误:使用$id +1生成value是错误逻辑,应直接使用血型记录的实际ID。

修正后的视图代码

<div class="form-group">
    <label for="blood_type_id">血型:</label>
    <select class="form-control" name="blood_type_id" disabled>
        <option value="">选择血型</option>
        <?php 
        // 获取患者当前的血型ID,优先使用old()(验证失败回显),否则用患者数据
        $selectedBloodType = old('blood_type_id') ?? $pacients['blood_type_id'];
        foreach ($blood_types as $ts): ?>
            <option <?= (string)$selectedBloodType === (string)$ts['id'] ? 'selected' : '' ?> value="<?= $ts['id'] ?>"><?= $ts['description'] ?></option>
        <?php endforeach; ?>
    </select>
    <?php echo session()->getFlashdata('errors')["blood_type_id"] ?? ""; ?>
</div>

额外注意事项

  • 确保getPacient($id)方法返回的患者数据中包含blood_type_id字段,且该字段值与血型表的id字段对应。
  • 如果表单启用了验证,old()会在验证失败时自动回显用户之前提交的值,修正后的代码已兼容这种场景。

内容的提问来源于stack exchange,提问作者user22236733

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 02:12:31