我需要使用perl创建一个网页,在textarea输入中将输入查询,点击执行按钮后,它应执行查询并以列表格式显示结果,列名称为动态标题。
所以我正在寻找的帮助是如何根据查询动态创建数据列和表的标题,特别是如何获取动态打印的列名,因为查询只会获取数据而不是标题的列名!
非常感谢你的帮助。
更新
Erik的代码有2个问题,没有。一个是因为它没有正确的意思没有正确地接近结果,如下图所示,列应该按照下面第二张图所示的方式分隔:
第二,它不按顺序打印列,如上图所示,应首先打印SHIPPERID列。
我想要的方式如下:
以下是经过修改的代码,如果有人按照第2张图片帮助我这样做,我将不胜感激。
my $i = 0;
my $tableHeader ;
my @tableRows ;
while (my $row = $sth->fetchrow_hashref ) {
$tableHeader = $q->thead( $q->Tr( $q->th( map { $_ } sort keys %{$row},) ) ) if $i == 0;
push( @tableRows, [ $q->td( map { $row->{$_} } sort keys %{$row},) ] );
$i++;
}
print $q->table( { -class => 'pure-table-striped', -border => 2, -bordercolor => '#989898' },
$tableHeader,
$q->Tr( [ map { join "", @$_ } @tableRows ] )
);
非常感谢你的帮助!!
答案 0 :(得分:3)
简化Erik的代码并修复它,以便始终按预期顺序显示列。:
my $dbquery = 'select * from Staff';
my $sth = $dbh->prepare($dbquery);
$sth->execute();
my $table_header = $cgi->thead( $cgi->Tr( $cgi->th ( $sth->{NAME} ) ) );
my @table_rows = map { $cgi->Tr ( $cgi->td( $_ ) ) } @{ $sth->fetchall_arrayref };
print $cgi->table(
{ -id => 'mytable' },
$table_header,
@table_rows,
);
答案 1 :(得分:2)
假设您将查询直接传递给DBI,可以获取列名,但这有点模糊:
my $sth = $dbh->prepare($query);
$sth->execute;
my @columns = @{$sth->{NAME}};
中找到更多信息
编辑:与上面@Erik的答案不同,这将按照您在查询中指定的顺序为您提供列。
答案 2 :(得分:0)
至于分号尝试:
my $string = "SELECT * FROM staff;";
$string =~ s/\;//g;
答案 3 :(得分:-1)
好的,所以我假设您已经拥有所有的数据库连接(以下假定为$dbh
)等设置并准备就绪,因为您没有提供有关此内容的任何信息你可能已经尝试过了。以下是应该执行您想要的代码段。对于问题的第二部分,如果你得到例如对于给定行的哈希引用,您可以获取列的名称(map { $_ } sort keys %{$row}
从它们创建一个数组)
my $dbquery = "select * from Staff";
my $sth = $dbh->prepare($dbquery);
$sth->execute();
my $i = 0;
while (my $row = $sth->fetchrow_hashref ) {
$tableHeader = $cgi->thead( $cgi->Tr( 'Shipper ID', $cgi->th( [ map { $_ } grep !/Shipper ID/, sort keys %{$row} ], ) ) ) if $i == 0;
push( @tableRows, [ $cgi->td( [ $row->{'Shipper ID'}, map { $row->{$_} } grep !/Shipper ID/, sort keys %{$row} ] ,) ] );
$i++;
}
print $cgi->table( { -id => 'mytable' },
$tableHeader,
$cgi->Tr( [ map { join "", @$_ } @tableRows ] )
);
编辑:在第一个版本中,两个[]
表达式周围缺少map
个。这照顾了奇怪的安排。
EDIT2:好的,所以我添加了一个黑客来挑出一个专栏。请注意,在这种情况下,您需要确实知道列的名称,否则grep
和$row
记录中的检索都不起作用。
这将执行查询,然后将从第一行的键和正常表行生成一个标题行,然后将所有内容放在一个表中。
请注意,此代码不一定是最漂亮和/或最有效的。
显然,当他们能够自由输入查询时,你应该确保人们不会做任何令人讨厌的代码注入。
这有帮助吗?