使用CodeIgniter LIKE活动记录获取MySQL语法错误


Getting MySQL syntax error using CodeIgniter LIKE active record

这是我的代码

return $this->db
            ->select('organization')
            ->like('title',$this->db->escape_str($query))
            ->or_like('description',$this->db->escape_str($query))
            ->get('shop_search')
            ->num_rows();

在CCD_ 3中存在CCD_ 1和NOT CCD_。

错误为:$query="d'"

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '%' OR `description` LIKE '%d'''''''%'' at line 3
SELECT `organization` FROM `default_shop_search` WHERE `title` LIKE '%d'''''''%' OR `description` LIKE '%d'''''''%'

我在这里错过了什么?

已传递查询的转储:

Debug #1 of 1: string(2) "d'"

使用CI活动记录类时不需要手动转义参数,只需删除$this->db->escape_str()方法即可:

return $this->db
        ->select('organization')
        ->like('title', $query)
        ->or_like('description', $query)
        ->get('shop_search')
        ->num_rows();

来自CI用户指南:

$this->db->like()

注意:传递到此方法的所有值都会自动转义。

更新

好的,这是我的测试用例:

$query = "e'";
$res = $this->db
            ->select()
            ->like('title', $query)
            ->or_like('description', $query)
            ->get('shop_search')
            ->num_rows();
var_dump($this->db->last_query());
// Output: string(96) "SELECT * FROM (`myPrefix_shop_search`) WHERE `title` LIKE '%e''%' OR `description` LIKE '%e''%'"
var_dump($res);
// Output: int(1)

正如我所料,AR只添加了一个反斜杠来转义$query。我在CI v2.1.4上运行此测试。

请修改你的逻辑,如果你没有发现任何错误,分享更多必要的代码,我洗耳恭听。

使用

$query = mysql_real_escape_string($query);
return $this->db
            ->select('organization')
            ->like('title',$query)
            ->or_like('description',$query)
            ->get('shop_search')
            ->num_rows();