【问题标题】:How to escape asterisk and question mark using RLIKE in PDO?如何在 PDO 中使用 RLIKE 转义星号和问号?
【发布时间】:2015-03-21 05:35:18
【问题描述】:

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

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

【问题讨论】:

    标签: php mysql database pdo


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-23
      • 1970-01-01
      • 2016-05-04
      • 2021-11-06
      • 2021-12-31
      • 1970-01-01
      • 2023-01-12
      相关资源
      最近更新 更多