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

标签 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. 

我怎样才能避免这个错误? *? 是唯一会导致此错误的两个特殊字符吗?

最佳答案

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/

相关文章:

php - 使用 Laravel 通过与枢轴链接的表搜索数据库

database - 数据库设计文档的标准

php - 一个接一个地执行多个数据库更新(一般错误 2014 )

javascript - Ajax 将 bool 值与 HTML 一起从服务器传递到具有 HTML 数据类型的客户端

MySQL 查询以获取跨行使用的所有不同字母

sql - 使用 REPLACE INTO 更新表中的时间戳

mysql - SQL查询以在密码列中选择一个字符串值?

php - 如何制作一个只有 1 个索引的数组到顶层?

PHP filter_var_array() 只检查一个值是否为真?

c# - 改进 Linq 查询