2016-11-07 28 views
1

使用逃生CakePHP中的特殊字符找到查詢

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 

現在,如果我的$文本=「%」,即?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 

在此,反斜槓也會被另一個反斜槓轉義。我認爲這是不正確的,因爲我們只需要轉義'%'

任何解決方案將肯定讚賞。如果我缺少任何信息,或者需要更多解釋,請告訴我。我會在評論中更新。

+2

請始終提,你正在使用的精確CakePHP的版本! – ndm

+0

謝謝,我已經更新了這個問題。 CakePHP版本2.5.1。 – sandeep

回答

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

} 

更換特殊字符後,您無需更改您的查詢