使用
Cakephp version: 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
在这里,反斜杠也被另一个反斜杠转义。我认为这是不正确的,因为我们只需要转义'%'
任何解决方案都将不胜感激。如果我缺少任何信息,或任何更多的解释,如果需要,请让我知道。我将在评论中更新
您可以使用正则表达式从字符串中删除所有特殊字符。
删除所有特殊字符
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*/
}
替换特殊字符后,无需更改Query