如何在 PDO 中使用 RLIKE 转义星号和问号?

How to escape asterisk and question mark using RLIKE in PDO?

我有一个按内容搜索帖子的查询。我仍在使用 mysql 5.5 和 innoDB,所以 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. 

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

Rlike 需要一个有效的正则表达式作为操作数。这意味着 'Yes, there are other characters than * and ? that will cause an error.'

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

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

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