2012-05-16 2 views
1

Я пытаюсь создать таблицу, используя CGI.pm. Таблица будет содержать результаты от запросов к базе данных. Окончание массива содержит номера записей, на которых выполняются запросы . Результаты для каждой записи должны быть в отдельной строке. Результат каждого запроса в записи должен содержать столбец в строке. Используя код, я нашел here, я написал следующее (который не может быть он лучший способ сделать это):Таблицы с использованием Perl CGI.pm

#!/usr/bin/perl 
use strict; 
use warnings; 
use CGI; 
use DBI; 

... 

my @rows; 
my $rec; 

foreach my $el (@final) { 
       @rows =(); 
    foreach my $query (@queries) { 
     my $query_handle = $connxn->prepare($query); 
     $query_handle->execute($el); 
     $query_handle->bind_columns(undef, \$rec); 
     while($query_handle->fetch()) { 
      push(@rows,td($rec)); 
     } 
    } 
    print $q->table({-border=>undef,-width=>'25%'}, 
     Tr(\@rows) 
     ); 
} 

Когда я запускаю это, я получаю пустую страницу и сообщение об ошибке «Не определено подпрограммой & main :: td " в журнале ошибок. Почему я получаю эту ошибку, и как я могу избавиться от нее? Есть ли какой-либо другой способ создать таблицу, в которой я хочу использовать CGI.pm? Любая помощь будет оценена по достоинству. Благодаря!

EDIT: Используя предложение Синана, я изменил свой код следующим образом:

#!/usr/bin/perl 
use strict; 
use warnings; 
use DBI; 
use Carp; 
use HTML::Template; 

... 
my @rows; 
my $rec; 
foreach my $el (@final) {  
    foreach my $query (@queries) {   
     my $query_handle = $connxn->prepare($query);   
     $query_handle->execute($el);   
     $query_handle->bind_columns(undef, \$rec);   
     while($query_handle->fetch()) {    
      push(@rows, { CELLS => [ map { CELL => $_ }, $rec ] });   
     }   
    } 
} 

my $tmpl = HTML::Template->new(filehandle => \*DATA); 
$tmpl->param(ROWS => \@rows); 
print $tmpl->output; 

__DATA__ 
<table> 
<TMPL_LOOP ROWS> 
<tr> 
<TMPL_LOOP CELLS> 
<td><TMPL_VAR CELL></td> 
</TMPL_LOOP> 
</tr> 
</TMPL_LOOP> 
</table> 

Но теперь я получаю результат каждого запроса в отдельной строке, вместо того же самого (см оригинальный вопрос выше). Кажется, я не могу это исправить самостоятельно. Есть идеи?

EDIT2: Хотя я принимаю ответ Синан, тем временем я разработал свое собственное решение (в случае, если кому-то интересно):

my @rows; 
my @rows1; 
foreach my $el (@final) { 
    @rows =(); 
    foreach my $query1 (@queries) { 
     my $query_handle = $connxn->prepare($query1); 
     $query_handle->execute($el); 
     $query_handle->bind_columns(undef, \$rec); 
     while($query_handle->fetch()) { 
      push(@rows, $rec);    
     }      
    } 
    push(@rows1, { CELLS => [ map { CELL => $_ }, @rows ] }); 
} 

ответ

3

Я знаю, вы думаете, что вы хотите использовать CGI.pm для создания таблиц, но вы не должны. Код будет уродлив, и это повредит.

Вместо этого отдельная презентация из логики. Избегайте функций генерации HTML CGI.pm. Используйте простой шаблонный модуль, например HTML::Template. Настройте HTML на содержание вашего сердца, не загружая свой код.

Учитывая обновления на ваш вопрос, я думаю, что вам нужно это:

foreach my $el (@final) { 
    my @cells; 
    foreach my $query (@queries) {   
     my $query_handle = $connxn->prepare($query);   
     $query_handle->execute($el);   
     $query_handle->bind_columns(undef, \$rec); 
     while($query_handle->fetch()) { 
      push @cells, { CELL => $rec }; 
     }   
    } 
    push @rows, { CELLS => \@cells }; 
} 
+0

Я понимаю, что вы имеете в виду, но я не могу понять, как его использовать в моем случае. Должен ли я хранить результаты в некоторой структуре данных, которые я передаю этой функции?Пожалуйста помоги мне с этим. – user828647

+0

Я не уверен, что вы видели мое обновление, но я думаю, что он отвечает на ваш вопрос. –

+0

Я просто скопировал ваши команды, а первый дал мне ошибку «Недостаточно аргументов для карты, рядом»} @ ". Кроме того, говорит 'синтаксическая ошибка около"} @ '. Я не уверен, почему это происходит. – user828647

2

Попробуйте использовать «use CGI qw(:standard);» вместо «use CGI;». В противном случае пространство имен CGI-модуля не будет импортировано.

Другой способ использует «push(@rows,CGI->td($rec))» вместо «td()».

Это также применимо на tr(\@rows)

Вот полный рабочий код:

#!/usr/bin/perl 
use strict; 
use warnings; 
use CGI qw(:standard); 
use DBI; 

... 

my @rows; 
my $rec; 

foreach my $el (@final) { 
    foreach my $query (@queries) { 
     my $query_handle = $connxn->prepare($query); 
     $query_handle->execute($el); 
     $query_handle->bind_columns(undef, \$rec); 
     while($query_handle->fetch()) { 
      push(@rows,td($rec)); 
     } 
    } 
    print table({-border=>undef,-width=>'25%'}, 
     tr(\@rows) 
     ); 
} 
+0

Спасибо, теперь по крайней мере, я могу увидеть таблицы! Но используя 'push (@ rows, td ($ rec)),' все равно дает мне каждый результат в новой строке вместо новой строки. Как это исправить? – user828647

+0

Линии == Строки! Или вы имеете в виду столбцы? – int2000

+0

К сожалению, я имел в виду «каждый результат в новой строке, а не новый столбец». Извините – user828647

Смежные вопросы