2014-08-28 35 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;