使用perl和oracle构建simle查询页面

使用perl和oracle构建simle查询页面,perl,cgi,Perl,Cgi,我需要使用perl创建一个网页,其中在文本区域输入中将键入查询,单击execute按钮后,它将执行查询,并以表格格式显示结果,列名称作为动态标题 因此,我正在寻找的帮助是如何根据查询动态地为数据创建列和表的标题,特别是如何动态地打印列名,因为查询只获取数据,而不获取标题的列名 非常感谢你的帮助 更新 Erik的代码有两个问题,第一个问题是它没有表格,这意味着没有正确地给结果加上边框,如下图所示,列之间应该用边框隔开,如下图2所示: 第二,它没有按顺序打印列,正如您在上图中看到的,应该先打印SHI

我需要使用perl创建一个网页,其中在文本区域输入中将键入查询,单击execute按钮后,它将执行查询,并以表格格式显示结果,列名称作为动态标题

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

非常感谢你的帮助

更新

Erik的代码有两个问题,第一个问题是它没有表格,这意味着没有正确地给结果加上边框,如下图所示,列之间应该用边框隔开,如下图2所示:

第二,它没有按顺序打印列,正如您在上图中看到的,应该先打印SHIPPERID列

我想要的方式如下所示:

这是修改后的代码,如果有人按照第二张图片帮助我,我将不胜感激

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

非常感谢你的帮助

假设您将查询直接传递给DBI,可以获取列名,但有点模糊:

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


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

好的,因此我假设您已经设置并准备好下面的所有DB连接,假设为$dbh等,因为您没有提供任何关于该连接的信息,也没有提供任何您可能已经尝试过的信息。下面是一段代码片段,它可以做您想要做的事情。对于问题的第二部分,例如,如果您获得给定行的hash ref,您可以获得列的名称映射{$\u0}排序键%{$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 ] )
                 );
编辑:在第一个版本中,两个映射表达式周围缺少[]。这就解决了这个奇怪的安排。 EDIT2:好吧,我加了一个黑客来挑出一个专栏。注意,在这种情况下,您需要真正知道列的名称,否则grep和从$row记录中检索都不起作用

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

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

显然,当人们能够自由地键入查询时,您应该确保他们不会对代码注入做任何不愉快的事情

这有用吗?

至于分号,请尝试:

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

简化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,               
);

哇!杰出的你是一个专业的朋友!!还有一个小问题,如何从图中所示的第一个屏幕上输入的查询中取出分栏,因为这会导致错误=thanks@TonyaLepski我解决了奇怪的列排列问题,我会想办法挑出你想要的专栏first@TonyaLepski添加了另一个黑客来挑出一个column@Erik:如果将列作为数组而不是散列获取,则可以保证以与查询相同的顺序获取它们。您可以使用$sth->{NAME}获得包含列名的arrayref。您完全重写了问题。这是不好的,因为现在看它的人将无法轻易看到人们回答的原始问题是什么。虽然您可以添加一些内容来对答案作出反应,但您应该保留原始问题,以免造成此类混淆,从而使原始问题变回原位。请不要删除这样的问题。这使得理解答案变得更加困难。非常感谢戴夫,非常感谢你的帮助!!一个简单的问题,如何获取从我们的例程中返回的行总数?是的。这显然是@table_rows数组的长度。你为什么不看看你是否可以用它来获取你想要的信息呢。谢谢Dave提供的指标my$cnt=@table_rows;