这是我的代码
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();
在'
中有"
而非$query
之前,每件事情都会有效。
错误是:$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'"
答案 0 :(得分:0)
在使用CI Active Record Class时,您无需手动转义参数,只需删除$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()
注意:传递给此方法的所有值都会自动转义。
好的,这是my test-case:
$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上运行此测试。
请修改你的逻辑,如果你没有发现任何错误,请分享更多必要的代码,我全都听见了。
答案 1 :(得分:0)
使用
$query = mysql_real_escape_string($query);
return $this->db
->select('organization')
->like('title',$query)
->or_like('description',$query)
->get('shop_search')
->num_rows();