逃脱Cakephp中的特殊字符查找查询

时间:2016-11-07 13:44:49

标签: php mysql cakephp escaping mysql-real-escape-string

使用

  

Cakephp版本:2.5.1

我找不到在Cakephp查找查询中处理特殊字符的解决方案。 如果你能指出我正确的方向,我会非常感激。

这是一段代码。此代码从名称满足特定条件的标题表中提取所有记录

public function findTitles($text) {
    return $this->find('all', 
        array(
            'fields' => array('id', 'name'),
            'conditions' => array(
                'OR' => array(
                    array('name LIKE ' => $text.'%'),
                    array('name LIKE ' => '% '.$text.'%')
                    ),
                'original' => 1
                ),
            'order' => array('id ASC'),
            'limit' => 10
            )
        );
}

因此,如果我的$text = "pro"例如?q=pro,则下面是生成的Mysql等效查询

SELECT `Title`.`id`, `Title`.`name` FROM `database`.`titles` WHERE ((`name` LIKE 'pro%') OR (`name` LIKE '% pro%')) AND `original` = 1  ORDER BY `id` ASC  LIMIT 10

现在如果我的$ text =“%”,即?q=%,则下面是生成的查询

SELECT `Title`.`id`, `Title`.`name` FROM `database`.`titles` WHERE ((`name` LIKE '%%') OR (`name` LIKE '% %%')) AND `original` = 1   ORDER BY `id` ASC  LIMIT 10

在这种情况下,我从表中获得前10条记录。我想要的是获取前10个记录,其中包含符号'%'。但是,CakePHP并没有逃脱它。

所以我尝试将这行代码放在我的函数中:

$text = str_replace('%',  '\%',  $text);

就像这样

public function findTitles($text) {
    $text = str_replace('%',  '\%',  $text);
    return $this->find('all', ................

然后我得到下面的mysql查询

SELECT `Title`.`id`, `Title`.`name` FROM `database`.`titles` WHERE ((`name` LIKE '\\%%') OR (`name` LIKE '% \\%%')) AND `original` = 1   ORDER BY `id` ASC  LIMIT 10

在此,反斜杠也会被另一个反斜杠转义。我认为这是不正确的,因为我们只需要逃避'%'

任何解决方案一定会受到赞赏。如果我遗漏任何信息,或者如果需要还有任何解释,请告诉我。我会在评论中更新。

1 个答案:

答案 0 :(得分:0)

  

您可以使用正则表达式删除字符串中的所有特殊字符。

删除所有特殊字符

public function findTitles($text) {
    $pattern  = '/[^A-Za-z0-9\-]/';  #Only allowed numbers and characters
    #$pattern = '/[^A-Za-z\-]/';     #Only allowed characters
    $text     = preg_replace($pattern '', $text);

    /*YOUR CODE HERE*/

}

更换特殊字符后,您无需更改查询