[英]Getting extra spaces in CodeIgniter MySQL query
我正在尝试运行的查询的代码是
$query = $this->db->select("*")->from('items')->like("replace(name, '=', ' ')", "foo bar", 'both')->get();
$items = $query->num_rows();
Mysql查询字符串是
SELECT replace(name, ' = ', ' ') FROM `items`
代码正在做的是在编译查询时在“=”之前和之后添加一个空格,导致“=”返回没有结果,因为名称中没有带“=”的项,只有“=”。
foo=bar, replace(name, '=', ' ') returns 1 result.
foo = bar, replace(name, ' = ', ' ') returns 0 results.
我正在使用的CodeIgniter版本是:3.0.6
我在我的CodeIgniter副本上测试了这个,当这样格式化时它可以正常工作:
$items = $this->db->like("replace(name, '=', ' ')", "foo bar", 'both')->get('items')->num_rows();
几点说明:
你的语法
$query = $this->db->select("*")->from('items')->like("replace(name, '=', ' ')", "foo bar", 'both')->get();
事实上这里显示的是产生这个查询
SELECT * FROM `items` WHERE replace(name, '=', ' ') LIKE '%foo bar%';
如果在foo和bar之间偶然出现一个空格则会失败。
试试这个替代查询
SELECT * FROM `items` WHERE replace(name, '=', ' ') LIKE '%foo% bar%';
笨
$query = $this->db->select('*')->from('items')->like("replace(name, '=', ' ')", "foo% bar", 'both')->get();
或者这个查询甚至更好
SELECT * FROM `items` WHERE CONCAT(TRIM(SUBSTRING_INDEX(name, '=', 1)),' ',TRIM(SUBSTRING_INDEX(name, '=', -1))) LIKE '%foo bar%';
不要使用它
SELECT * FROM `items` WHERE replace(name, '=', ' ') LIKE '%foo%bar%';
这些查询的结果显示在此处
你可以有一个删除前导/尾随空格的查询( 例子 )
我找不到与codeigniter或php相关联的方法调用replace()
。
尝试str_replace(find,replace,string)
例
$one = 'as = bb = cc=dd ';
$var = str_replace('=', ' ', $one);
echo $var;
并且不要在查询中重构代码。 使其干净并将其传递给查询。 它也很容易跟踪错误。
我用了
$this->db->query()
代替
$this->db->select();
$this->db->order_by();
$this->db->get();
它对我有用。
我的疑问是:
$records = $this->db->select(
"id,( select count(*) from
( select
unnest(string_to_array(mycol,',')) v
from mytable ) t where v::int > 0) as total",
FALSE)->order_by("col1")->get("mytable1")->result_array();
问题是,它在string_to_array(mycol,', ')
添加了一个额外的空间,这给了错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.