【问题标题】:CodeIgniter Query Escaping QuotesCodeIgniter 查询转义引号
【发布时间】:2018-07-25 10:27:04
【问题描述】:

我有以下在 MySQL 中完美运行的简单查询;

select * from client_contact
where date_format(client_next_contact_on, '%Y-%m-%d') = '2018-07-25'

然后我在我的 codeigniter 查询中添加了这个,但我得到的错误是;

您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 3 行的“2018-07-25”附近使用正确的语法

SELECT * FROM (client_contact) WHERE dateformat(client_next_contact_on, '%Y-%m-%d') '2018-07-25'

从上面看,它在查询中缺少 =

这是我在 codeigniter 中的查询;

$today = new DateTime();
$today_formatted = $today->format('Y-m-d');
$this->db->where('dateformat(client_next_contact_on, \'%Y-%m-%d\')', $today_formatted);
$return = $this->db->get('client_contact')->row_array();

如果您想知道为什么我需要使用 date_format,那是因为它作为日期时间存储在我的数据库中用于其他目的。为此,我需要一份我今天需要联系的客户列表,无论何时。

【问题讨论】:

    标签: php mysql codeigniter


    【解决方案1】:

    只需在 where 语句中包含等号,并重命名 dateformat,因为它不是 MySQL 中的函数。使用DATE_FORMAT

    $this->db->where('DATE_FORMAT(client_next_contact_on, \'%Y-%m-%d\') =', $today_formatted);
    

    现在,深入了解为什么 code igniter 选择不包含等号(根据文档,它应该包含)。在 codeigniter 源的this line 上,它调用此函数以确定它是否包含运算符。显然是因为你在, 后面放了一个空格,它认为你包含了一个运算符,所以一个简单的手动调整来添加它就可以了。

    protected function _has_operator($str)
    {
        return (bool) preg_match('/(<|>|!|=|\sIS NULL|\sIS NOT NULL|\sEXISTS|\sBETWEEN|\sLIKE|\sIN\s*\(|\s)/i', trim($str));
    }
    

    您可以在此处查看正则表达式匹配的位置:https://regex101.com/r/BTuZxj/1

    【讨论】:

      猜你喜欢
      • 2016-02-28
      • 1970-01-01
      • 1970-01-01
      • 2014-12-24
      • 2014-08-27
      • 1970-01-01
      • 1970-01-01
      • 2013-06-12
      • 2017-11-12
      相关资源
      最近更新 更多