CodeIgniter中使用explode与where_in批量更新数据异常求助
解决CodeIgniter中使用where_in批量更新时所有行被更新的问题
嘿,我懂你这会儿的头疼——本来想批量更新指定ID的行,结果所有数据都被改了,肯定超闹心!咱们来揪出问题根源,把它修好。
问题出在哪?
先看你现有的代码逻辑:
- 控制器里你把拆出来的ID数组包在了
array('id'=>$ids)里传给模型 - 模型的
update方法直接把这个关联数组丢给了where_in,但where_in的正确用法是第一个参数传字段名,第二个参数传值数组。你现在的写法等于没指定要过滤的字段,导致数据库没有任何条件限制,自然所有行都被更新了。
修正后的代码
控制器代码
$ids = explode(',', $this->post('id')); // 直接传ID数组就行,不用套关联数组 $this->chatmod->update($ids, $data);
模型代码
public function update($ids = null, $data = null) { // 明确指定过滤字段为'id',再传入ID数组 $this->db->where_in('id', $ids); $this->db->update($this->table, $data); return true; }
额外的健壮性优化(可选)
为了避免空数组或者无效参数导致的误操作,你可以给模型加个校验:
public function update($ids = null, $data = null) { // 先校验参数有效性 if (!is_array($ids) || empty($ids) || empty($data)) { return false; // 或者根据业务需求抛出提示 } $this->db->where_in('id', $ids); $this->db->update($this->table, $data); // 返回实际被更新的行数,比单纯返回true更实用 return $this->db->affected_rows(); }
这样修改后,where_in会生成正确的SQL条件WHERE id IN (xxx,xxx),只会更新你指定ID的行,不会再误伤全表数据啦~
内容的提问来源于stack exchange,提问作者Gusti Erlangga
相关产品推荐
相关产品推荐

