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

如何将患者选中的所有症状ID存入数组并保存至MySQL数据库

问题分析与解决

核心问题1:变量名不匹配

你初始化的数组是$arr_selected_symptom_ids,但循环里却往$arr_id_gejala_terpilih里存数据,导致原本用来存储症状ID的数组始终为空,后续用它操作数据库自然没有数据。

核心问题2:SQL注入风险

直接把用户提交的$gejala拼进SQL语句,没有任何过滤处理,很容易遭到注入攻击,医疗类应用数据敏感,这个风险必须重视。

核心问题3:缺少数据库插入逻辑

你的代码只完成了收集ID、生成HTML列表的操作,但没有把这些ID写入数据库的INSERT执行逻辑,等于只做了数据收集,没做持久化存储。


修正后的代码示例

<?php
// 初始化正确的数组
$arr_selected_symptom_ids = array();
$no = 0;
$list_data = '';

// 先检查表单提交状态,避免未定义索引报错
if(isset($_POST['gejala']) && is_array($_POST['gejala'])){
    // 使用预处理语句防范SQL注入
    $stmt = mysqli_prepare($con, "SELECT kode_gejala, nama_gejala FROM gejala WHERE id_gejala = ?");
    mysqli_stmt_bind_param($stmt, "i", $gejala_id); // 假设id_gejala是整数类型

    foreach ($_POST['gejala'] as $gejala_id) {
        // 将ID存入正确的目标数组
        $arr_selected_symptom_ids[] = $gejala_id;

        // 执行查询并获取结果
        mysqli_stmt_execute($stmt);
        $rgejala = mysqli_stmt_get_result($stmt);
        $gejala_data = mysqli_fetch_assoc($rgejala);

        // 生成HTML列表,同时转义输出内容防XSS
        if($gejala_data){
            $list_data .= '
            <tr>
                <td>' . ++$no . '. </td>
                <td>&nbsp;</td>
                <td>' . htmlspecialchars($gejala_data['kode_gejala']) . ' - ' . htmlspecialchars($gejala_data['nama_gejala']) . '</td>
            </tr>';
        }
    }
    mysqli_stmt_close($stmt);

    // 将选中的症状ID插入数据库(假设关联表为patient_symptoms,字段为patient_id和symptom_id)
    // 需确保你已获取当前患者的ID,示例中用$patient_id表示
    if(!empty($arr_selected_symptom_ids) && isset($patient_id)){
        $insert_stmt = mysqli_prepare($con, "INSERT INTO patient_symptoms (patient_id, symptom_id) VALUES (?, ?)");
        mysqli_stmt_bind_param($insert_stmt, "ii", $patient_id, $symptom_id);

        foreach($arr_selected_symptom_ids as $symptom_id){
            mysqli_stmt_execute($insert_stmt);
        }
        mysqli_stmt_close($insert_stmt);
    }
}
?>

额外注意事项

  • 表单中症状复选框的name属性必须是gejala[](带方括号),否则PHP无法接收到数组格式的提交数据。
  • 可以用mysqli_stmt_affected_rows()检查数据库插入操作的受影响行数,确认数据是否成功写入。

内容的提问来源于stack exchange,提问作者Rahmanda Ikhsan Ferdiansyah

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 14:43:20