使用
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
在此,反斜杠也会被另一个反斜杠转义。我认为这是不正确的,因为我们只需要逃避'%'
任何解决方案一定会受到赞赏。如果我遗漏任何信息,或者如果需要还有任何解释,请告诉我。我会在评论中更新。
答案 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*/
}
更换特殊字符后,您无需更改查询