Cakephp查找查询中的特殊字符转义
使用 Cakephp版本:2.5.1 在Cakephp find查询中,我很难找到处理特殊字符的解决方案。 如果你能为我指出正确的方向,我将非常感激 这是一段代码。此代码从名称满足某些条件的标题表中获取所有记录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'),
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。