如何将患者选中的所有症状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> </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
相关产品推荐
相关产品推荐

