使用MySQL和带有字边界的REGEX的Codeigniter查询生成器增加了额外的空间

时间:2017-04-07 22:29:53

标签: php mysql codeigniter-3 query-builder

有了这个问题,我真的希望尽可能避免修改核心文件,因此解决方法会非常有用。

REGEX适用于'其中'查询构建器类很容易,但使用单词边界通过添加额外的空间来打破它。

function search($searchQuery){
    $sq = '[[:<:]]'.strtolower($searchQuery).'[[:>:]]';
    $this->db->select('column');
    $this->db->from('table');
    $this->db->where('LOWER(otherColumn) REGEXP', $sq);
    echo $this->db->get_compiled_select();
}

search('billy');

预期结果:

  

SELECT column FROM table WHERE LOWER(otherColumn)REGEXP   &#39; [[:其中:]]比利[[产品:&gt;:]]&#39 ;;

实际结果:

  

SELECT column FROM table WHERE LOWER(otherColumn)REGEXP   [[:&lt; :]]比利[[产品:&gt;:]]&#39 ;;

这是一个特定堆栈的特定问题,我还没有发现任何人遇到同样的问题。我试过逃避冒号,方括号,似乎没什么用。或者它增加了额外的反斜杠。

此时任何帮助或指示都会有所帮助。

提前致谢。

1 个答案:

答案 0 :(得分:1)

function search($searchQuery){
    $sq = $this->db->escape('[[:<:]]'.strtolower($searchQuery).'[[:>:]]');
    $this->db->select('column');
    $this->db->from('table');
    $this->db->where('LOWER(otherColumn) REGEXP ', $sq, false); 
    echo $this->db->get_compiled_select();
}

search('billy');

对于Codeigniter v 3.1.6和MySQL v5.6

仅仅因为Codeigniter在编译查询时在<之前和之后添加了空格,我不知道为什么会这样做。我已经转义变量$sp的值以减轻注入攻击或相同。因此添加了第三个参数false,以防止它重新转义和添加空格。

我没有经历过其他版本的codeigniter。我希望这会奏效。

有关MySQL REGEXP的详细信息,请访问此链接:MySQL 5.6 Reference Manual - Regular Expressions