Codeigniter 2多表关联查询结果异常:WHERE子句疑似问题排查
问题分析:CodeIgniter 2 查询结果不符合预期的原因
嘿,我看了你的CodeIgniter 2查询代码,问题确实出在WHERE子句和几个细节上,咱们一步步来拆解:
核心问题:WHERE子句的语法错误
你的查询里多了一个多余的右括号,直接破坏了过滤逻辑:
WHERE `doc`.`status` = 'Processing' AND `track`.`action` = '1') AND `track`.`location` = '$office'
这里的)完全是多余的,数据库解析时要么直接报错,要么会错误截断你的过滤条件,导致大量符合要求的记录被错误排除。
次要问题:SQL注入风险
你直接把$office变量拼进了SQL语句里,这是典型的SQL注入漏洞。在CodeIgniter里应该用查询绑定来处理用户输入,既能避免安全问题,也能保证SQL语法的正确性。
可选优化:JOIN类型的合理性
你用了JOIN(内连接)关联transactions表,如果有些文档没有对应的交易记录,这些文档会被直接过滤掉。如果业务上允许文档没有交易记录但仍需展示,建议把JOIN transactionsAStrans改成`LEFT JOIN `transactions` AS `trans。
修正后的代码(两种方案)
方案1:修正原始查询并添加绑定
$office = $this->session->userdata('department'); $query = "SELECT `doc`.`id`, `doc`.`barcode`, `doc`.`sub`, `doc`.`source_type`, `doc`.`sender`, `doc`.`address`, `doc`.`description`, `doc`.`receipient`, `doc`.`status`, DATE_FORMAT(`doc`.`datetime_added`, '%m/%d/%Y-%h:%i %p') as datetime_added, (SELECT GROUP_CONCAT(`tag`) FROM `tags` WHERE `tags`.`documentId` = `doc`.`id` GROUP BY `tags`.`documentId`) as `tags` FROM `documents` AS `doc` JOIN `transactions` AS `trans` ON `doc`.`id` = `trans`.`document_id` JOIN `trackers` AS `track` ON `doc`.`id` = `track`.`document_id` WHERE `doc`.`status` = 'Processing' AND `track`.`action` = '1' AND `track`.`location` = ? ORDER BY `doc`.`id` DESC"; // 使用查询绑定避免SQL注入 $go = $this->db->query($query, array($office))->result_array(); var_dump($go); exit();
方案2:使用CodeIgniter Active Record(更推荐)
CodeIgniter的Active Record不仅更安全,还能让代码更易读和维护:
$office = $this->session->userdata('department'); $this->db->select(" doc.id, doc.barcode, doc.sub, doc.source_type, doc.sender, doc.address, doc.description, doc.receipient, doc.status, DATE_FORMAT(doc.datetime_added, '%m/%d/%Y-%h:%i %p') as datetime_added, (SELECT GROUP_CONCAT(tag) FROM tags WHERE tags.documentId = doc.id GROUP BY tags.documentId) as tags "); $this->db->from('documents doc'); $this->db->join('transactions trans', 'doc.id = trans.document_id'); $this->db->join('trackers track', 'doc.id = track.document_id'); $this->db->where('doc.status', 'Processing'); $this->db->where('track.action', '1'); $this->db->where('track.location', $office); $this->db->order_by('doc.id', 'DESC'); $go = $this->db->get()->result_array(); var_dump($go); exit();
内容的提问来源于stack exchange,提问作者RJB
相关产品推荐
相关产品推荐

