我有一个按内容搜索帖子的查询。我仍在使用带有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.
如何避免此错误? *
和?
是导致此错误的唯一两个特殊字符吗?
答案 0 :(得分:2)
Rlike需要一个有效的正则表达式作为操作数。这意味着'是的,除了*
和?
之外还有其他字符会导致错误。'
如何避免?这取决于你想要达到的目标。最简单的方法是完全避免使用正则表达式。如果您需要用户可以输入任何正则表达式,验证它的最佳方法是在查询中使用它并在错误时捕获错误。
如果您只想查找包含该字符串的内容,则使用like
会更加可靠。而且您只需要转义%
和_
。
$search = '%'.str_replace(array('%', '_'), array('\%', '\_'), $_GET['content']).'%';
$sql = "SELECT title,content FROM table1 WHERE content LIKE ?";
...