Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: разработка для Web > Генерация таблицы, согласно заданным условиям


Автор: Dam0n 25.6.2010, 14:38
Здравствуйте.

Суть задачки в следующем. В результате выборки из БД
Код

my $sql = "SELECT id, fio, name FROM users";
my $sth = $dbh->prepare($sql);$sth->execute();
my ($id, $fio, $name);
while ( my $ref = $sth->fetchrow_hashref() ) {
    $id = $ref->{'id'};
    $fio = $ref->{'fio'};
    $name = $ref->{'name'};
}

получаю три строки:
$id| $fio    | $name
1  | Иванов  | Иван
3  | Сидоров | Степан
5  | Петров  | Павел


Необходимо сгенерировать пустую таблицу на 10 строк, например таким образом:
Код

print qq~
<table border="1" cellpadding="0" cellspacing="0" width="400">
    <tr>
        <td>N п\п</td>
        <td>Фамилия</td>
        <td>Имя</td>
    </tr>~;

for(my $i=1;$i<=10;$i++) {
print qq~
    <tr>
        <td>$i</td>
        <td>&nbsp;</td>
        <td>&nbsp;</td>
    </tr>~;
}

print qq~
</table>~;

и вставить в таблицу на свое место данные, которые были выбраны из БД. 

В итоге должна получиться вот такая табличка:
N 
п\п! Фамилия ! Имя
---+---------+-----
1  + Иванов  ! Иван
---+---------+-----
2  +         +
---+---------+-----
3  ! Сидоров ! Степан
---+---------+-----
4  +         +
---+---------+-----
5  ! Петров  ! Павел
---+---------+-----
6  +         +
---+---------+-----
7  +         +
---+---------+-----
8  +         +
---+---------+-----
9  +         +
---+---------+-----
10 +         +
---+---------+-----

Планирую сравнивать $i из цикла с $id из while и вставлять это в создаваемую таблицу.  Например:
Код

if ($i == $id) {
print qq~
    <tr>
        <td>$id</td>
        <td>$fio</td>
        <td>$name</td>
    </tr>~;
}
но ничего не получается. По-этому решил обратиться к тебе, О всезнающий All smile

Заранее спасибо!

Автор: ginnie 25.6.2010, 14:50
Dam0n, я бы данные из БД сохранял в хэш с ключем id записи. В цикле генерации строк проверял наличие данных в хэше и выводил.

Автор: Dam0n 25.6.2010, 15:03
можно примерчик для визуала?

Автор: ginnie 25.6.2010, 15:35
Пример даю фрагментами:

Код

my %users;
while ( my $ref = $sth->fetchrow_hashref() ) {
    $users{$ref->{id}} = [@{$ref}{'id','fio','name'}];
}


Код

for(my $i=1;$i<=10;$i++) {
my ($surname, $name) = exists $users{$i} ? $users{$i}[1,2] : ('&nbsp')x2;
print qq~
    <tr>
        <td>$i</td>
        <td>$surname</td>
        <td>$name</td>
    </tr>~;
}

Автор: Dam0n 25.6.2010, 16:51
ОК.. спасибо ...  попробую
о результатах обязательно сообщу

Автор: Dam0n 28.6.2010, 11:48
ginnie, спасибо за подсказку ... все работает, но только если 
Код

my ($surname, $name) = exists $users{$i} ? $users{$i}[1,2] : ('&nbsp')x2;

то перл ругается "<!-- warning: Use of uninitialized value in concatenation (.) or string at D:/www/wwwroot/cgi­bin/test3.pl line 68. -->" на $name
Пришлось сделать в две строки
Код

my ($surname) = exists $users{$i} ? $users{$i}[1] : ('&nbsp')x2;
my ($name) = exists $users{$i} ? $users{$i}[2] : ('&nbsp')x2;


А есть еще какие-то варианты реализации данной задачки?

Автор: ginnie 28.6.2010, 14:15
Dam0n, я привел ошибочный код, правильно будет так: 

Код

my ($surname, $name) = exists $users{$i} ? @{$users{$i}}[1,2] : ('&nbsp')x2;


то, что Вы написали тоже не совсем правильно, хотя и работает.

Автор: Dam0n 28.6.2010, 18:06
спасибо! все получилось

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)