如何阻止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
相关产品推荐
相关产品推荐

