使用perl和oracle构建一个简单的查询页面

时间:2014-08-28 22:07:14

标签: perl cgi

我需要使用perl创建一个网页,在textarea输入中将输入查询,点击执行按钮后,它应执行查询并以列表格式显示结果,列名称为动态标题。

enter image description here

所以我正在寻找的帮助是如何根据查询动态创建数据列和表的标题,特别是如何获取动态打印的列名,因为查询只会获取数据而不是标题的列名!

非常感谢你的帮助。

更新

Erik的代码有2个问题,没有。一个是因为它没有正确的意思没有正确地接近结果,如下图所示,列应该按照下面第二张图所示的方式分隔:

enter image description here

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

我想要的方式如下:

enter image description here

以下是经过修改的代码,如果有人按照第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 ] )
                 );

非常感谢你的帮助!!

4 个答案:

答案 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}};

您可以在DBI documentation

中找到更多信息

编辑:与上面@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记录中的检索都不起作用。

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

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

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

这有帮助吗?