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

如何阻止CodeIgniter中$this->db->update查询自动转义(数组传参场景)

在CodeIgniter中使用数组传参给set()时阻止自动转义的方法

好问题!当你用数组形式给$this->db->set()传参时,确实没办法直接通过一个全局参数关闭所有自动转义,但有两个实用的方法可以解决这个问题:

方法1:在数组中为单个字段指定不转义规则

你可以在更新数组中,把需要跳过转义的字段值写成嵌套数组,明确指定escape为FALSE。这种方式的好处是可以精准控制哪些字段不转义,哪些字段保持自动转义:

// 构建更新数组,部分字段指定不转义
$updateData = array(
    // 这个字段会跳过转义,执行字段自增操作
    'view_count' => array('value' => 'view_count + 1', 'escape' => FALSE),
    // 普通字符串值会自动转义(适合用户输入等安全场景)
    'last_updated' => '2024-05-20',
    // 调用SQL函数时也可以用这种方式跳过转义
    'created_at' => array('value' => 'NOW()', 'escape' => FALSE)
);

$this->db->set($updateData);
$this->db->where('id', 123);
$this->db->update('articles');

方法2:循环数组逐个调用set()并关闭转义

如果你的更新数组中所有字段都不需要自动转义(比如都是SQL表达式或函数),可以通过循环遍历数组,逐个调用$this->db->set()并传入第三个参数FALSE:

// 所有值都是SQL表达式,不需要转义
$updateData = array(
    'score' => 'score + 10',
    'level' => 'level * 2',
    'updated_at' => 'CURRENT_TIMESTAMP'
);

// 循环遍历数组,逐个设置字段并关闭转义
foreach ($updateData as $field => $value) {
    $this->db->set($field, $value, FALSE);
}

$this->db->where('user_id', 456);
$this->db->update('user_stats');

如果只有部分字段需要不转义,也可以在循环里加条件判断,灵活控制是否关闭转义。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:39:26