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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 01:24:03