Perl DBI - 绑定列表
Perl DBI - binding a list
如何在 Perl DBI 中将变量绑定到 SQL 集以用于 IN 查询?
示例:
my @nature = ('TYPE1','TYPE2'); # This is normally populated from elsewhere
my $qh = $dbh->prepare(
"SELECT count(ref_no) FROM fm_fault WHERE nature IN ?"
) || die("Failed to prepare query: $DBI::errstr");
# Using the array here only takes the first entry in this example, using a array ref gives no result
# bind_param and named bind variables gives similar results
$qh->execute(@nature) || die("Failed to execute query: $DBI::errstr");
print $qh->fetchrow_array();
上述代码的结果仅产生 TYPE1
的计数,而所需的输出是 TYPE1
和 TYPE2
的计数之和。将绑定条目替换为对 @nature
(\@nature
) 的引用,导致 0 个结果。
这个的主要用例是允许用户使用复选框组之类的东西来检查多个选项,它是 return 所有结果。一种解决方法是构造一个字符串以插入到查询中 - 它可以工作,但是它需要大量过滤以避免 SQL 注入问题并且它很丑陋...
在我的例子中,数据库是 Oracle,理想情况下我想要一个不受数据库影响的通用解决方案。
?
占位符应与 @nature
中的元素一样多,即。 in (?,?,..)
my @nature = ('TYPE1','TYPE2');
my $pholders = join ",", ("?") x @nature;
my $qh = $dbh->prepare(
"SELECT count(ref_no) FROM fm_fault WHERE nature IN ($pholders)"
) or die("Failed to prepare query: $DBI::errstr");
如何在 Perl DBI 中将变量绑定到 SQL 集以用于 IN 查询?
示例:
my @nature = ('TYPE1','TYPE2'); # This is normally populated from elsewhere
my $qh = $dbh->prepare(
"SELECT count(ref_no) FROM fm_fault WHERE nature IN ?"
) || die("Failed to prepare query: $DBI::errstr");
# Using the array here only takes the first entry in this example, using a array ref gives no result
# bind_param and named bind variables gives similar results
$qh->execute(@nature) || die("Failed to execute query: $DBI::errstr");
print $qh->fetchrow_array();
上述代码的结果仅产生 TYPE1
的计数,而所需的输出是 TYPE1
和 TYPE2
的计数之和。将绑定条目替换为对 @nature
(\@nature
) 的引用,导致 0 个结果。
这个的主要用例是允许用户使用复选框组之类的东西来检查多个选项,它是 return 所有结果。一种解决方法是构造一个字符串以插入到查询中 - 它可以工作,但是它需要大量过滤以避免 SQL 注入问题并且它很丑陋...
在我的例子中,数据库是 Oracle,理想情况下我想要一个不受数据库影响的通用解决方案。
?
占位符应与 @nature
中的元素一样多,即。 in (?,?,..)
my @nature = ('TYPE1','TYPE2');
my $pholders = join ",", ("?") x @nature;
my $qh = $dbh->prepare(
"SELECT count(ref_no) FROM fm_fault WHERE nature IN ($pholders)"
) or die("Failed to prepare query: $DBI::errstr");