我正试图摆脱我正在编写的用于处理if
查询的子例程末尾的SELECT
语句:
sub select_query {
my ($params, $query, $return_type) = @_;
my $qh = $dbx->prepare($query);
my $param_count = 1;
foreach my $param (@$params) {
$qh->bind_param($param_count++, $param);
}
$qh->execute;
if ($return_type eq 'fetchrow_array') {
return $qh->fetchrow_array;
}
if ($return_type eq 'fetchall_arrayref') {
return $qh->fetchall_arrayref;
}
... AND SO ON ...
}
我熟悉调度表调用不同子程序的想法。我可以用什么代码有效地调用$ qh句柄上的各种dbi方法?
答案 0 :(得分:5)
您需要的只是$qh->$return_type(...)
。
如果您想验证,可以使用简单的查找表。
my @valid_return_types = qw( fetchrow_array ... );
my %valid_return_types = map { $_ => 1 } @valid_return_types;
die "..." if !$valid_return_types{$return_type};
答案 1 :(得分:0)
创建语句句柄后,您需要定义调度表。
my %dispatch = (fetchall_arrayref => sub {return $_[0]->fetchall_arrayref},
fetchall_hashref => sub {return $_[0]->fetchall_hashref('User')},
fetchrow_array => sub {return $_[0]->fetchrow_array});
my $dbh = DBI->connect("DBI:mysql:mysql:localhost", 'root', 'password') or die;
my $sth = $dbh->prepare("select * from user");
foreach my $type (qw(fetchall_arrayref fetchall_hashref fetchrow_array)) {
$sth->execute;
print Dumper $dispatch{$type}->($sth);
}
<强>更新强> 实际上,让我做一个修正。如果您愿意,可以在创建语句句柄之前定义调度表。
<script src="js/bxslider.js"></script>