Perl-скрипт из HTML-формы (флажок выпуск)

0

Несколько заметок перед вопросом: я ни в коем случае не программист, но мне поручено заставить это работать. Я знаю самые основы и как сменить пару вещей, начиная с того, что они делали, прежде чем, но заканчивается, когда заканчивается мой набор навыков. Я отредактировал это, чтобы сэкономить место и сделать его максимально простым. Я знаю, что этот скрипт perl старый, но с этим я должен работать.

У меня есть форма на HTML-странице, которая имеет что-то вроде следующих параметров:

<form action="/cgi-bin/form.pl" method="post" name="form">
    <input type="checkbox" name="morning_class" value="name1">
    <select name="Priority"><option value="">--Select--</option><option value="1">1</option><option value="2">2</option><option value="3">3</option></select>


    <input type="checkbox" name="morning_class" value="name2">
    <select name="Priority"><option value="">--Select--</option><option value="1">1</option><option value="2">2</option><option value="3">3</option></select>


    <input type="checkbox" name="morning_class" value="name3">
    <select name="Priority"><option value="">--Select--</option><option value="1">1</option><option value="2">2</option><option value="3">3</option></select>


    <input type="checkbox" name="morning_class" value="name4">
    <select name="Priority"><option value="">--Select--</option><option value="1">1</option><option value="2">2</option><option value="3">3</option></select>


    <input type="checkbox" name="morning_class" value="name5">
    <select name="Priority"><option value="">--Select--</option><option value="1">1</option><option value="2">2</option><option value="3">3</option></select>

    <p><label class="field_pledge" for="fname">First Name:</label> <input maxlength="50" name="First_Name" size="32" type="text"></p>
    <p><label class="field_pledge" for="lname">Last Name:</label> <input maxlength="50" name="Last_Name" size="32" type="text"></p>
    <p><label class="field_pledge" for="email">EMail:</label> <input name="Email" size="32" type="text"></p>

    <p><input type="submit" value="Submit"> &nbsp; <input type="reset" value="Clear Form"></p>

</form>

Мне нужно, чтобы пользователь ограничивался тем, что вам нужно было выбрать только 3 выбора из флажков вверху. Затем они должны перечислить свои приоритетные варианты, которые Утренний класс они хотят принять в порядке от 1-3 (это связано с расписанием).

В настоящее время сценарий Perl выглядит следующим образом (и, как я уже упоминал выше, я знаю, что это старый скрипт, но я застрял в нем, потому что это то, что было дано мне, и я не программист):

#!/usr/bin/perl

#Variables
$queryString;
$contentLength;
$number;
$sendmail="/usr/sbin/sendmail";

@testarray;

%testhash;

$contentLength = $ENV{"CONTENT_LENGTH"};
$return = "/thankyou/";

if($contentLength != NULL){
    read(STDIN, $queryString, $contentLength);
}

@testarray = split(/&|=/,$queryString);

$number = @testarray;

for ($counter = 0; $counter <= $number; $counter++){
    @testarray[$counter] =~ s/\+/ /g;
    @testarray[$counter] =~ s/%([0-9A-Fa-f]{2})/pack("c",hex($1))/ge;
}

%testhash = @testarray;

##MESSAGE FORMATTING

$finalmailbody = "Title of Email - Registration Form\n\n";

$finalmailbody .= "First Name:  $testhash{First_Name}\n";
$finalmailbody .= "Last Name:   $testhash{Last_Name}\n";
$finalmailbody .= "Email:   $testhash{Email}\n";

##OPEN EMAIL AND SEND

open(MAILREGISTRATION, "|$sendmail -oi -t") || die  "Can't open pipe to $sendmail: $!\n";
print MAILREGISTRATION "To: me\@mywebsite.com\n";
print MAILREGISTRATION "From: $testhash{Email}\n"; 
print MAILREGISTRATION "Subject: Conference Submission\n\n";

print MAILREGISTRATION "$finalmailbody";
close(MAILREGISTRATION) or die "Can't close pipe to $sendmail: $!\n";

print "Content-type: text/html\n\n";
print "<HTML>\n";
print "<HEAD>\n";
print "  <META HTTP-EQUIV=Refresh CONTENT=0;URL=$return>\n";
print "</HEAD>\n";
print "<BODY>\n";
print "</BODY>\n";
print "</HTML>\n";

Итак, в настоящее время, когда что-то происходит, я получаю следующее письмо:

Имя: (введено значение)

Фамилия: (введена информация)

Электронная почта: (введена информация)

Часть того, где они вводят данные, не является проблемой. Я знаю, как изменить эти строки и добавить больше, если потребуется.

Здесь возникает моя проблема:

Если бы я должен был создать строку в форматировании сообщения так:

$finalmailbody .= "Course 1:    $testhash{morning_class}\n";
$finalmailbody .= "Course 2:    $testhash{morning_class}\n";
$finalmailbody .= "Course 3:    $testhash{morning_class}\n";

Все, что он делает, это отправить по электронной почте последний курс, который выбран так:

Курс 1: имя3

Курс 2: имя3

Курс 3: имя3

Теперь я знаю, что в скрипте Perl должен быть какой-то код, чтобы сортировать данные, полученные им из данных (name = morning_class), но это то, где мои знания ограничивают меня дальнейшим продвижением.

В конце концов, я хочу, чтобы на экране было отправлено электронное письмо:

Курс 1: имя1 Приоритет: 3

Курс 2: имя2 Приоритет: 1

Курс 3: имя3 Приоритет: 2

Имя: (введено значение)

Фамилия: (введена информация)

Электронная почта: (введена информация)

Для меня важнее часть Perl.

Если это можно понять, тогда я буду открыт для предложений о том, как ограничить выбор не более или менее 3 (у меня есть что-то в настоящее время, но если есть лучший способ, я бы хотел его увидеть) и как связать в списке приоритетов, который будет отправлен по электронной почте, а также с выбранным флажком.

Если есть какие-то другие вопросы, на которые нужно ответить, дайте мне знать, и я проясню это насколько это возможно.

Мне нужна вся помощь, и я могу надеяться, что кто-то здесь будет потрясающим и поможет мне. Заранее спасибо!

Теги:
forms
email
checkbox

2 ответа

0
Лучший ответ

Было бы намного проще, если вы используете CGI, вы можете столкнуться с множеством проблем с такими параметрами обработки, как это, и это сделает ваш скрипт уязвимым.

В своем HTML вы должны связать каждое меню Priority с его флажком, например:

<input type="checkbox" name="morning_class" value="name2">
<select name="name2_Priority">

Затем вы можете обрабатывать вот так:

my (%testhash,@classes);
while (my($name,$value) = splice(@testarray,0,2) ) {
    if ($name eq 'morning_class') {
        push(@classes,$value);
    }
    else {
        $testhash{$name} = $value;
    }
}
# remove any empty priority
@classes = grep { $testhash{$_.'_Priority'} } @classes; 
for my $class (@classes) {
    $testhash{$class} = $testhash{$class.'_Priority'};
}
# sort by priority
@classes = sort { $testhash{$a} <=> $testhash{$b} } @classes; 
# truncate array to 3 elements if necessary
$#classes = 2 if $#classes > 2;

Теперь у вас в @classes массив из 3 элементов, отсортированных по приоритету, а имя каждого класса имеет значение приоритета в% testhash

Обновление. Чтобы распечатать классы:

for my $class (@classes) {
    $mailbody .= "Course: $class Priority: $testhash{$class.'_Priority'}\n";
}

Обновление 2: для дневных занятий просто добавьте еще один массив @aclasses:

my (%testhash,@classes,@aclasses);
while (my($name,$value) = splice(@testarray,0,2) ) {
    if ($name eq 'morning_class') {
        push(@classes,$value);
    }
    elsif ($name eq 'afternoon_class') {
        push(@aclasses,$value);
    }
    else {
        $testhash{$name} = $value;
    }
}

Теперь повторите все, что вы делаете, в @classes, только делайте это с помощью @aclasses

  • 0
    Итак, как мне распечатать их по электронной почте? Как и так ?: $finalmailbody .= "Class 1: $testhash{_Priority}\n"; $finalmailbody .= "Class 2: $testhash{_Priority}\n"; Извините, как я уже сказал, я очень новичок в этом, и меня как бы бросили в это, поэтому каждая мелочь будет полезна.
  • 0
    Смотрите обновление, чтобы ответить
Показать ещё 3 комментария
0

Итак, быстрый и грязный хак внизу. Примечание. Чтобы он работал, вам нужно переименовать свои html-поля в morning_class1... morning_class5 и Priority1... Priority5. Когда вы конвертируете свой список значений в хэш, только одно значение может быть связано с ключом с именем "morning_class" (например, последний).

my @list =  map { $_ =~ /^Priority([\d]+)/; $1; }
    sort { $testhash{$a} <=> $testhash{$b}  }
    grep { $_ =~ /^Priority/ } keys %testhash;

@list = splice @list, 0, 3; # Take top 3 sorted

for(my $i=0; $i<scalar(@list); $i++) {
    $finalmailbody .= "Course " . ($i + 1) . ": " . $testhash{"morning_class${list[$i]}"} . ", Priority: " . $testhash{"Priority${list[$i]}"} . "\n";
}

Если бы я писал это, а не взламывал его, я бы сделал несколько вещей, которые я бы сделал по-другому. Я бы добавил некоторую проверку, используя скрипт на стороне клиента, чтобы ваш Perl никогда не получал больше трех вариантов. Даже если это работает, пользователь может установить одинаковый приоритет для каждого выбора, поэтому сортировка будет бессмысленной.

Примечание. Я просто понял, что вы не просили их сортировать по приоритету, но я написал это.

  • 0
    Спасибо за это. Я проверю это в понедельник. Имеет ли значение, где я размещаю код в скрипте perl? Я знаю, что раздел FOR будет идти с остальной частью почтового тела.
  • 0
    Не могли бы вы привести пример того, как я могу проверить свои выпадающие списки приоритетов и убедиться, что для отмеченных 3 выбран порядок приоритетов?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню