我有一个按内容搜索帖子的查询。我仍在使用带有 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.
我怎样才能避免这个错误? *
和 ?
是唯一会导致此错误的两个特殊字符吗?
最佳答案
Rlike 需要一个有效的正则表达式作为操作数。这意味着“是的,除了 *
和 ?
之外还有其他字符会导致错误。”
如何避免?这完全取决于您想要实现的目标。最简单的方法是完全避免使用正则表达式。如果您需要用户可以输入任何正则表达式,验证它的最佳方法是在查询中使用它并在格式错误时捕获错误。
如果您只想查找包含该字符串的内容,使用like
更为可靠。您只需要转义 %
和 _
。
$search = '%'.str_replace(array('%', '_'), array('\%', '\_'), $_GET['content']).'%';
$sql = "SELECT title,content FROM table1 WHERE content LIKE ?";
...
关于php - 如何在 PDO 中使用 RLIKE 转义星号和问号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29179628/