CodeIgniter框架下删除person表JSON数组字段中指定ID元素的方案咨询
实现思路
- 原代码核心错误:遍历JSON解码后的数组时,将数组值当作数组下标执行unset操作,无法正确定位并删除目标元素;同时将in_array判断放在循环内属于冗余逻辑,直接拼接变量到SQL语句也存在SQL注入风险。
- 修复逻辑:首先校验入参合法性,查询到人员对应的JSON格式群组ID后,过滤掉待删除的群组ID,重置数组索引后重新编码写回数据表即可。
- 可选优化:如果使用MySQL 5.7及以上版本,可直接调用MySQL内置JSON函数完成删除操作,无需PHP层面处理数组,性能更高。
可运行代码
版本1:PHP层面处理数组(兼容所有数据库版本)
// 接收参数并做有效性校验 $processToId = $this->input->post("personId"); $processToGroupId = $this->input->post("groupId"); if (empty($processToId) || empty($processToGroupId)) { echo json_encode(['status' => false, 'msg' => '请求参数缺失']); exit; } // 查询对应人员的群组ID数组,使用查询绑定避免SQL注入 $emailGroupStr = $this->db ->where("JSON_CONTAINS(person.personEmailGroup, ?) > 0", json_encode([$processToGroupId])) ->where("personId", $processToId) ->get('person') ->row("personEmailGroup"); if (empty($emailGroupStr)) { echo json_encode(['status' => false, 'msg' => '未找到对应人员或群组关联关系']); exit; } // 解码为数组后过滤目标ID $groupArr = json_decode($emailGroupStr, true); $groupArr = array_filter($groupArr, function ($id) use ($processToGroupId) { return $id != $processToGroupId; }); // 重置数组索引,避免json_encode生成对象格式 $groupArr = array_values($groupArr); // 更新数据回表 $updateData = [ "personEmailGroup" => json_encode($groupArr) ]; $updateStatus = $this->db->where("personId", $processToId)->update("person", $updateData); echo json_encode(['status' => $updateStatus]);
版本2:MySQL原生JSON函数实现(要求MySQL 5.7+)
// 接收参数并做有效性校验 $processToId = $this->input->post("personId"); $processToGroupId = $this->input->post("groupId"); if (empty($processToId) || empty($processToGroupId)) { echo json_encode(['status' => false, 'msg' => '请求参数缺失']); exit; } // 直接调用MySQL JSON函数完成删除操作 $updateSql = "UPDATE person SET personEmailGroup = JSON_REMOVE(personEmailGroup, JSON_UNQUOTE(JSON_SEARCH(personEmailGroup, 'one', ?))) WHERE personId = ? AND JSON_CONTAINS(personEmailGroup, ?)"; $updateStatus = $this->db->query($updateSql, [ $processToGroupId, $processToId, json_encode([$processToGroupId]) ]); echo json_encode(['status' => $updateStatus]);
内容的提问来源于stack exchange,提问作者Damien Falborgson
相关产品推荐
相关产品推荐

