Cakephp查找查询中的特殊字符转义

Cakephp查找查询中的特殊字符转义,php,mysql,cakephp,escaping,mysql-real-escape-string,Php,Mysql,Cakephp,Escaping,Mysql Real Escape String,使用 Cakephp版本:2.5.1 在Cakephp find查询中,我很难找到处理特殊字符的解决方案。 如果你能为我指出正确的方向,我将非常感激 这是一段代码。此代码从名称满足某些条件的标题表中获取所有记录 public function findTitles($text) { return $this->find('all', array( 'fields' => array('id', 'name'),

使用

Cakephp版本:2.5.1

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

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

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
SELECT `Title`.`id`, `Title`.`name` FROM `database`.`titles` WHERE ((`name` LIKE '%%') OR (`name` LIKE '% %%')) AND `original` = 1   ORDER BY `id` ASC  LIMIT 10
现在,如果我的$text=“%”,即
?q=%
,那么下面就是生成的查询

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
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
在这种情况下,反斜杠也会被另一个反斜杠转义。我认为这是不正确的,因为我们只需要逃避“%”

任何解决方案都将受到赞赏。如果我遗漏了任何信息,或者需要更多解释,请告诉我。我将在评论中更新

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

删除所有特殊字符

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*/

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

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

删除所有特殊字符

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*/

}

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

请始终提及您使用的确切CakePHP版本!谢谢,我已经更新了问题。CakePHP版本2.5.1。请始终提及您使用的确切CakePHP版本!谢谢,我已经更新了问题。CakePHP版本2.5.1。