2014-08-28 32 views
-1

我需要使用perl创建一个网页,在textarea输入中查询将被键入,并且在单击执行按钮时它应该执行查询并以tabularized格式显示结果列名称作为标题动态。使用perl和oracle构建一个simle查询页面

enter image description here

所以我在寻找帮助的是如何创建列的动态地取决于查询,数据的标题和表特别是如何让动态印刷作为查询只获取数据的列名不是标题的列名!

非常感谢您的帮助。

更新

有2个问题与Erik的代码,没有。其中之一是它不是制表意思不是结果正确接壤,你可以在下面的图片中,列应该由边境一路之隔看到它在下面第二个图所示:

enter image description here

。第二,它不按顺序打印列,如上图所示,应先打印SHIPPERID列。

我想要的方式,是在:

enter image description here

下面是修改后的代码,如果有人帮我做,我会明白,按照第二个画面。

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 ]) 
       ); 

很多很多感谢您的帮助!

+1

你完全重写你的问题中显示的列。这种情况并不好,因为现在看到的人不能很容易地看到人们回答的原始问题。虽然您可以添加事件以对答案作出反应,但您应该保留原始问题以避免造成这种类型的混淆 – Erik 2014-08-29 07:40:27

+0

已编辑以恢复原始问题。请不要删除这样的问题。这使得更难理解答案。 – 2014-08-29 09:02:10

回答

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,    
); 
+0

非常感谢Dave,您的帮助真的很感谢! – TonyaLepski 2014-08-29 15:17:41

+0

一个简单的问题,如何获得从我们拥有的例程中返回的总行数? – TonyaLepski 2014-08-29 15:23:12

+0

是的。这显然是'@ table_rows'数组的长度。你为什么不看看你是否可以用它来获取你想要的信息。 – 2014-08-29 15:29:36

2

假设你通过你的查询直接向DBI,有可能得到的列名,但它是一个有点晦涩难懂:

my $sth = $dbh->prepare($query); 
$sth->execute; 
my @columns = @{$sth->{NAME}}; 

你可以发现更多的信息在DBI documentation

编辑:与上面的@Erik的答案不同,这将按照您在查询中指定的顺序为您提供列。

+0

你是对的先生! – TonyaLepski 2014-08-29 06:42:17

-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表达缺失。这照顾了奇怪的安排。编辑2:好吧,所以我添加了一个黑客来挑出一列。请注意,在这种情况下,您需要真正知道列的名称,否则grep$row记录的检索都不起作用。

这将执行查询,然后将从第一行的键和普通表行中生成一行标题行,并将所有内容放在一个表中。

请注意,此代码不一定是最漂亮和/或最有效的。

显然你应该确保在他们能够自由输入查询时,人们不会做任何讨厌的代码注入。

这有帮助吗?

+0

哇!优秀 !!你是亲哥们! – TonyaLepski 2014-08-29 00:00:34

+0

一个小问题仍然存在,我如何从图片中显示的第一个屏幕上输入的查询中取出半决赛因为这会导致错误=谢谢 – TonyaLepski 2014-08-29 00:04:37

+0

@TonyaLepski我修复了奇怪列安排的问题,我会看到以一种方式来选出你想要的列作为第一个 – Erik 2014-08-29 07:24:21

0

至于分号尝试:

my $string = "SELECT * FROM staff;"; 
    $string =~ s/\;//g;