3

Perl DBI で IN クエリの SQL セットに変数をバインドするにはどうすればよいですか?

例:

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のカウントの合計です。バインド エントリを( )への参照に置き換えると、結果は 0 になります。TYPE1TYPE2@nature\@nature

これの主な使用例は、ユーザーがチェックボックス グループのようなものを使用して複数のオプションをチェックできるようにすることであり、すべての結果を返すことです。回避策は、クエリに挿入する文字列を作成することです。これは機能しますが、SQL インジェクションの問題を回避するために多くのフィルタリングが必要であり、醜いです...

私の場合、データベースは Oracle です。理想的には、データベースの影響を受けない汎用ソリューションが必要です。

4

1 に答える 1

3

?にある要素と同じ数のプレースホルダーが必要@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");
于 2015-01-27T11:01:18.973 に答える