CodeIgniter查询构造器where()减法表达式自动引号错误排查
CodeIgniter WHERE条件中减法运算导致SQL语法错误的问题分析
问题代码
public function semua_data1() { $this->db->select('*'); $this->db->from('tbl_m_stock'); $tgl = date('Y-m-d', strtotime("-365 day", strtotime(date('Y-m-d')))); $this->db->join('tbl_t_purchase', 'tbl_m_stock.purchase_id = tbl_t_purchase.purchase_id', 'left'); $this->db->where('tbl_t_purchase.create_date <', $tgl); $this->db->where('tbl_m_stock.stockin - tbl_m_stock.stockout >', 0); return $this->db->get(); }
报错信息
错误代码:1064
SQL语法错误;请查看对应MariaDB版本的手册,了解在'tbl_m_stock.stockout>0'附近使用的正确语法
生成的SQL:SELECT * FROMtbl_m_stockLEFT JOINtbl_t_purchaseONtbl_m_stock.purchase_id=tbl_t_purchase.purchase_idWHEREtbl_t_purchase.create_date< '2022-01-26' ANDtbl_m_stock.stockin -tbl_m_stock.stockout>0
文件路径:D:/xampp/htdocs/SINARBANGUNAN07/system/database/DB_driver.php
行号:691
问题原因
你第二个where()的写法触发了CodeIgniter的字段解析逻辑错误。框架的where()方法默认会把第一个参数中运算符(如>)左侧的内容识别为单个字段名,自动添加反引号包裹。
你写的'tbl_m_stock.stockin - tbl_m_stock.stockout >'被框架错误拆分:它将tbl_m_stock.stockin -当作了一个完整字段,于是给这个部分加上反引号,生成了tbl_m_stock.stockin -这种非法的字段名,最终导致SQL语法错误。
解决方案
有两种可靠的写法可以避免这个问题:
- 直接传入完整条件字符串
将整个WHERE条件作为单个字符串传入where(),框架不会做字段拆分处理:
$this->db->where('tbl_m_stock.stockin - tbl_m_stock.stockout > 0');
- 给运算表达式加括号,明确边界
通过括号包裹运算表达式,让框架正确识别运算符的位置:
$this->db->where('(tbl_m_stock.stockin - tbl_m_stock.stockout) >', 0);
两种写法都能生成正确的SQL语句,解决语法错误问题。
内容的提问来源于stack exchange,提问作者Kahfi
相关产品推荐
相关产品推荐

