CodeIgniter查询转义引号

时间:2018-07-25 10:27:04

标签: php mysql codeigniter

我有以下简单的查询,可在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)在哪里   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,那是因为它以日期时间的形式存储在数据库中,用于其他目的。为此,我需要不限时间的今天需要联系的客户清单。

1 个答案:

答案 0 :(得分:3)

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

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

现在,让我们来看看为什么代码点火器选择不包括等号的原因(根据文档,它应该有)。在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