You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 * FROM tbl_m_stock LEFT JOIN tbl_t_purchase ON tbl_m_stock.purchase_id = tbl_t_purchase.purchase_id WHERE tbl_t_purchase.create_date < '2022-01-26' AND tbl_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语法错误。

解决方案

有两种可靠的写法可以避免这个问题:

  1. 直接传入完整条件字符串
    将整个WHERE条件作为单个字符串传入where(),框架不会做字段拆分处理:
$this->db->where('tbl_m_stock.stockin - tbl_m_stock.stockout > 0');
  1. 给运算表达式加括号,明确边界
    通过括号包裹运算表达式,让框架正确识别运算符的位置:
$this->db->where('(tbl_m_stock.stockin - tbl_m_stock.stockout) >', 0);

两种写法都能生成正确的SQL语句,解决语法错误问题。

内容的提问来源于stack exchange,提问作者Kahfi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 13:05:23