1
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
在此,反斜槓也會被另一個反斜槓轉義。我認爲這是不正確的,因爲我們只需要轉義'%'
任何解決方案將肯定讚賞。如果我缺少任何信息,或者需要更多解釋,請告訴我。我會在評論中更新。
請始終提,你正在使用的精確CakePHP的版本! – ndm
謝謝,我已經更新了這個問題。 CakePHP版本2.5.1。 – sandeep