如何在PDO中使用RLIKE来逃避星号和问号?

时间:2015-03-21 05:35:19

标签: php mysql database pdo

我有一个按内容搜索帖子的查询。我仍在使用带有innoDB的mysql 5.5,因此RLIKE似乎是唯一的选择之一:

$sql = "SELECT title,content FROM table1 WHERE content RLIKE ?";
$i = 1;
$users = $dbh->prepare($sql);
$users->bindValue($i++, $purifier->purify($_GET['content']), PDO::PARAM_STR);
$users->execute();

但我发现当我输入星号或问号作为参数值时(例如www.site.com?content=*),我得到了

SQLSTATE[42000]: Syntax error or access violation: 
1139 Got error 'repetition-operator operand invalid' from regexp. 

如何避免此错误? *?是导致此错误的唯一两个特殊字符吗?

1 个答案:

答案 0 :(得分:2)

Rlike需要一个有效的正则表达式作为操作数。这意味着'是的,除了*?之外还有其他字符会导致错误。'

如何避免?这取决于你想要达到的目标。最简单的方法是完全避免使用正则表达式。如果您需要用户可以输入任何正则表达式,验证它的最佳方法是在查询中使用它并在错误时捕获错误。

如果您只想查找包含该字符串的内容,则使用like会更加可靠。而且您只需要转义%_

$search = '%'.str_replace(array('%',  '_'), array('\%', '\_'), $_GET['content']).'%';
$sql = "SELECT title,content FROM table1 WHERE content LIKE ?";
...