Форма, метод POST [SOLVED]

Приветствую всех, есть форма, в заголовке:

Quote:

< form action="script.cgi" method="POST" >
< table >

далее в цикле табличка (выводятся данные из базы) :
Quote:

< tr > < td > < input type=checkbox > < /td > < td >тут текст из базы< /td > < /tr >

и низ:
Quote:

< tr >< td > < input type=sybmit value="ok" > < /td >< /tr >
< /table >
< /form >

как считывать данные их checkbox, чтобы получать после submit ID записи и его состояние "чекед" он или нет.

PS: Надеюсь понятно расписал что именно требуется.. уже неделю голову ломаю - немогу понять как это делается на PERL/CGI. Отсюда становится понятно почему большинство любит PHP - там гораздо удобнее обрабатывать формы.

Получаем отмеченные checkbox

Уважаемый fu7ur3!

Вместо "< input type=checkbox >" пишем <input type="checkbox" name="checkbox_01" value="checked"> и в скрипте получаем для отмеченных checkbox'ов значения checkbox_01 == checked. Если имена checkbox'ов заранее неизвестны, то получаем имена всех переданных скрипту параметров и выбираем из них checkbox'ы по шаблону.
Иногда нужно узнать, какие checkbox'ы были выключены. Для этого я либо передаю id включенных checkbox'ов в специальном hidden-поле, либо храню на стороне сервера.

P.S. Старый уже стал, забыл еще вариант попроще и, наверное, побыстрее: у checkbox'ов указываем одинаковый name, а в value указываем некий id. В скрипте для указанного name получаем массив отмеченных id.

...

Quote:

Вместо "< input type=checkbox >" пишем

Пишу с пробелами, потому что в друпале почему-то в теге [ quote ] не отображается html код.
Quote:

...и в скрипте получаем для отмеченных checkbox'ов значения checkbox_01 == checked.

вот например у меня в форме нарисовалось 5 пунктов и напротив каждого стоит < input type="checkbox" name="checkbox_01">
я выделяю нужные флажки, жму submit.
print param('checkbox_01'); #выводится on если отметил, но как получать ID ?
Чтобы получить ID сделал так:
my $show_all = $db->prepare("SELECT id, name, ip, time, text FROM `new_quotes`");
$show_all->execute();
    print $head;
while (my @quotes = $show_all->fetchrow_array()) {
print qq(
    < form action="/cgi-bin/test/admin.cgi" method="POST" >
    < center >
    < table border=1 width=730 >
    < tr > < td width=1% >< input type="checkbox" name="$quotes[0]" >< /td >
< td width=5% >$quotes[0]< /td >
< td width=12% >$quotes[1]< /td>
< td width=15% >$quotes[2]< /td >
< td width=25% >$quotes[3]< /td >< /tr >
    < tr >< td colspan=5 >< pre>$quotes[4]< /pre>< /td>< /tr>
    < /table>
    );
}

т.е. так получается что у каждого checkbox имя соответствует иду из базы..
Вопрос, как получать и обрабатывать эти данные из другово блока ?
------------------
use Source();

В продолжение...

Уважаемый fu7ur3!

Как я написал в первом сообщении, лучше использовать второй метод: <input type="checkbox" name="ids" value="$quotes[0]">

Кроме этого, советую начать пользоваться шаблонами. Посмотрите HTML::Template.

Спасибо за ответы.

ginnie, спасибо за помощь. Потихоньку начал разбираться, и о шаблонах давно уже подумывал, не знал только как модуль называется.
Еще вопрос появился:

print param('quote');                     #53 51 (выводятся через пробел IDы чекбоксов)
my @ids = split(/\s+/,param('quote'));    #в массив @ids должны находиться элементы.
print scalar(@ids);                       #выводит 1 - в чем ошибка ?

------------------
use Source();

Совет...

Уважаемый fu7ur3!

У меня тоже бывают ситуации, когда что-то работает не так, как задумывалось. Почти всегда помогает отладочная информация. В Вашем случае, необходимо воспользоваться модулем Data::Dumper:

use Data::Dumper;
print param('quote');                     #53 51 (выводятся через пробел IDы чекбоксов)
my @ids = split(/\s+/,param('quote'));    #в массив @ids должны находиться элементы.
warn Dumper(@ids);
print scalar(@ids);                       #выводит 1 - в чем ошибка ?

В результате выведется содержимое массива @ids.

глюк

ginnie, сделал как ты написал, получилось следующее:

В Web'е:

use Data::Dumper;
my @ids = split(/\s+/,param('quote'));
warn Dumper(@ids);                       #видимо в WEB не умеет выводить
print "$ids[0]\n$ids[1]";

В консоле:

use Data::Dumper;
my $xz = "52 51";
my @ids = split(/\s+/, $xz);
warn Dumper(@ids);                       #$VAR1 = '52'; $VAR2 = '51'; - все ОК!

еще один вопрос получается..

------------------
use Source();

=)

Все просто до безобразия:

my @var = param('quote');

------------------
use Source();

Пояснение...

warn() на страницу выводить не умеет, т.к. это функция для вывода сообщений в STDERR (стандартный поток ошибок, обычно файл error.log web-сервера). Я обычно вывожу сообщения об ошибках и отладочную информацию в STDERR, а не на страницу.

как например

часто тож приходится ковыряться с чекбоксами, делаю следующее:
для чекбокса name="какаято_фраза_$id_from_DB"
а далее в скрипте перебираю по всем id в цикле
print ((param("какаято_фраза_$id_from_DB" eq 'on') ? "OK" : "NO");