在CodeIgniter MySQL查询中获取额外空间


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();

注意事项:

  1. 您不需要from(),只需将表滑入get()方法即可
  2. 您可以链接您的方法,因此只需要分配一个变量
  3. 省略select()方法意味着select('*')

您的语法

$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%';

CodeIgniter

$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;

phpfiddle预览

不要在查询中重构代码。将其清除并传递给查询。跟踪错误也很容易。

我使用

$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,', ')上添加了一个额外的空间,这导致了错误。