我们目前正在使用lib_mysqludf_preg UDF与Codeigniter和Activerecord进行正则表达式模式匹配.使用PREG_REPLACE UDF,我能够通过自定义查询剥离所有非数字和字母字符,Activerecord失败并在非对象上返回错误result()
作品:
$query = $this->db->query(sprintf("SELECT * FROM table WHERE PREG_REPLACE('/[^a-zA-Z 0-9]+/' , '', UPPER(first_name)) = '%s' AND PREG_REPLACE('/[^a-zA-Z 0-9]+/' , '', UPPER(last_name)) = '%s'", $first_name, $last_name));
不起作用:
$this->db->where("PREG_REPLACE('/[^a-zA-Z 0-9]+/' , '', UPPER(first_name))", $first_name);
$this->db->where("PREG_REPLACE('/[^a-zA-Z 0-9]+/' , '', UPPER(last_name))", $last_name);
$query = $this->db->get('table');
是什么赋予了?
解决方法:
在这种情况下,最好将自己的子句手动编写为字符串.
顺便说一句,您可以在where()
方法中添加第三个参数并将其设置为FALSE,以防止CodeIgniter使用反引号保护您的字段或表名:
$this->db->where("PREG_REPLACE('/[^a-zA-Z 0-9]+/' , '', UPPER(first_name)) = '$first_name'", NULL, FALSE);
$this->db->where("PREG_REPLACE('/[^a-zA-Z 0-9]+/' , '', UPPER(last_name)) = '$last_name'", NULL, FALSE);
$query = $this->db->get('table');