PHP用for循环遍历数组值查询数据库仅返回最后一条如何解决
问题排查与解决
第一步:确认数据库中是否存在对应数据
直接在你的数据库执行以下SQL,查看返回结果行数:
SELECT * FROM exams WHERE title IN ('1Z0-060','98-375','98-368','98-367');
如果返回结果只有1条(对应98-367),说明前三个编码在title字段不存在,可检查编码是否存在于slug等其他字段,或确认编码是否正确。
第二步:解决查询条件累积问题
你所使用的数据库查询构造器(大概率为CodeIgniter框架)默认会累积链式调用的条件,如果未主动重置,多次调用where()方法会生成WHERE title = '1Z0-060' AND title = '98-375' AND ...的无效查询,无法匹配任何数据。
修改模型的exam方法,每次查询前重置查询状态即可:
public function exam($q, $d) { // 重置之前的查询条件,避免累积 $this->db->resetQuery(); $query = $this->db->where($q, $d) ->get('exams'); return $query->row(); }
如果是CodeIgniter 3版本,get()执行后会自动重置查询条件,你可以打印执行的SQL确认条件是否正确:
public function exam($q, $d) { $query = $this->db->where($q, $d) ->get('exams'); // 日志输出SQL,排查条件是否符合预期 log_message('debug', '执行的查询SQL:'.$this->db->last_query()); return $query->row(); }
性能优化方案
循环调用查询会产生多次数据库请求,性能开销极大,建议使用whereIn单次查询所有匹配数据:
// 模型新增批量查询方法 public function getExamsByCode($field, $codes) { $this->db->resetQuery(); $query = $this->db->whereIn($field, $codes) ->get('exams'); return $query->result(); } // 业务层调用 $arrayTB = $this->Functions->getExamsByCode('title', $ecodesAr); // 可选:按编码为key重组数组,方便后续调用 $arrayTB = array_column($arrayTB, null, 'title');
内容的提问来源于stack exchange,提问作者HAMMAD ALI
相关产品推荐
相关产品推荐

