sql - Perl DBI : Escaping a LIKE prepared statement

标签 sql perl dbi

我有一个将参数绑定(bind)到 LIKE 语句的查询,如下所示:

my $sth = $dbh->prepare('SELECT foo FROM bar WHERE baz LIKE ?');
$sth->execute("%$like%");

但是,$like 是用户输入的值。因此,如果该值包含 LIKE 子句识别的任何特殊字符(&_\),这些未转义地传递到数据库并解析为通配符或转义字符。例如,如果用户输入 %value,则将提交的查询为:SELECT foo FROM bar WHERE baz LIKE '%%value',而不是 LIKE '%\%value,这是我所期望的。

目前我正在使用正则表达式手动转义该字段:

# Escape LIKE wildcard characters
$like =~ s!\\!\\\\!g;
$like =~ s!%!\\%!g;
$like =~ s!_!\\_!g;

my $sth = $dbh->prepare('SELECT foo FROM bar WHERE baz LIKE ?');
$sth->execute("%$like%");

但感觉转义是 DBI 应该能够处理的。我使用了 DBI::quote,但这是为引用整个字段而设计的,因此在这种情况下,它还会引用我添加的 % 符号以及文档对于 DBI::quote 特别指出:

The quote() method should not be used with "Placeholders and Bind Values".

是否有更好的方法将用户提供的输入绑定(bind)到 LIKE 子句,同时转义输入并添加相关通配符,而不需要手动转义输入?

最佳答案

尽管DBI::quote 的文档有说明,LIKE 参数还是有点特殊。您想要做的几乎就是示例中已经拥有的内容:首先通过将 quote 应用于用户提供的字符串来确保不存在用户提供的元字符(您在示例中使用正则表达式来执行此操作) ),然后添加您自己的元字符(在本例中为百分号),然后将其用作绑定(bind)参数的食物。

关于sql - Perl DBI : Escaping a LIKE prepared statement,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34760973/

相关文章:

perl - WWW::Mechanize::Firefox 和 MozRepl

c - RaiseError (PERL, DBI) 相当于 unixODBC C API?

sql - 在 sql server 2008 中使用最小匹配条件运行 SQL 查询

MySql SELECT 通过拆分由 || 分隔的多个值

regex - perl 正则表达式括号匹配

perl - 数据库驱动器 :SQLite disconnect

perl - 如何从Perl的DBI中获取模式?

sql - SQLite 索引的最佳数据类型

没有ORDER BY的Where子句中的SQL Row_Number()函数?

perl - 散列键周围的引号是 Perl 中的一个好习惯吗?