Perl CGI Form с повторным использованием предыдущих данных - PullRequest
1 голос
/ 26 января 2012

Я создаю форму регистрации с Perl (используя модуль CGI ) и recaptcha.Форма отлично работает и передает данные в базу данных SQL.Однако, когда я создаю другого пользователя с формой, данные, введенные в базу данных, совпадают с данными первого пользователя.Я получаю данные формы на своей странице подтверждения, используя my $var = $cgi->param('param_name'); Нужно ли мне очистить параметры или это что-то еще?(Я пытался $cgi->delete_all();, но это ничего не помогало)

Код проверки формы: (Это буквально прототип, поэтому безопасность еще не решена)

my $challenge = $q->param('recaptcha_challenge_field');
my $response = $q->param('recaptcha_response_field');
my $username = $q->param('Username');
my $password = $q->param('Password');
my $name = $q->param('Name');
my $email = $q->param('Username');
my $security = $q->param('Security');
my $answer = $q->param('Answer');
my $permissions = 1;

# Verify submission
my $result = $c->check_answer(
    "my_private_key", $ENV{'REMOTE_ADDR'},
    $challenge, $response
);

if ( $result->{is_valid} ) {
    insert_new_user();
    print  $q->redirect('cgi-bin/admin/text_campaign.pl');
}
else {
    # Error
    print  $q->redirect('login.pl?crc=false');
}

###############################################################################
# Sub Routines                                                                #
###############################################################################
sub insert_new_user
{
    my $sql = "INSERT INTO users (u_username, u_password, u_realname, u_email, u_security_question, u_security_answer, PRIVILEGES_idPRIVILEGES)
               VALUES(?, ?, ?, ?, ?, ?, ?) ";
    my $sth=$dbh->prepare($sql);
    $sth->execute($username, $password, $name, $email, $security, $answer, $permissions);
    $sth->finish();

    return;
}

1 Ответ

0 голосов
/ 26 января 2012

Да, так оно и есть. Посмотрите на -nosticky "прагму" в документации

http://perldoc.perl.org/CGI.html#PRAGMAS

или функция delete_all ().

--- РЕДАКТИРОВАТЬ ---

Я немного поиграл с измененной формой образца, которая есть в документации CGI.pm. Включая его здесь для удобства и потому что я немного его изменил.

#!/usr/bin/perl

use CGI qw/-nosticky :standard/;

print header;
print start_html("Example CGI.pm Form");
print "<h1> Example CGI.pm Form</h1>\n";
do_work();
print_prompt();
print_tail();
print end_html;

sub print_prompt {
    print "<hr>\n";
    print start_form;
    print "<em>What's your name?</em><br>";
    print textfield('name');
    print checkbox('Not my real name');
    print "<p><em>Where can you find English Sparrows?</em><br>";
    print checkbox_group(
                            -name=>'Sparrow locations',
                            -values=>[England,France,Spain,Asia,Hoboken],
                            -linebreak=>'yes',
                            -defaults=>[England,Asia]);
    print "<p><em>How far can they fly?</em><br>",
        radio_group(
                -name=>'how far',
                -values=>['10 ft','1 mile','10 miles','real far'],
                -default=>'1 mile');
    print "<p><em>What's your favorite color?</em>  ";
    print popup_menu(-name=>'Color',
                            -values=>['black','brown','red','yellow'],
                            -default=>'red');
    print hidden('Reference','Monty Python and the Holy Grail');
    print "<p><em>What have you got there?</em><br>";
    print scrolling_list(
                    -name=>'possessions',
                    -values=>['A Coconut','A Grail','An Icon',
                            'A Sword','A Ticket'],
                    -size=>5,
                    -multiple=>'true');
    print "<p><em>Any parting comments?</em><br>";
    print textarea(-name=>'Comments',
                            -rows=>10,
                            -columns=>50);
    print "<p>",reset;
    print submit('Action','Shout');
    print submit('Action','Scream');
    print end_form;
    print "<hr>\n";
}

sub do_work {
    print "<h2>Here are the current settings in this form</h2>";
    for my $key (param) {
        print "<strong>$key</strong> -> ";
        my @values = param($key);
        print join(", ",@values),"<br>\n";
    }
}

sub print_tail {
    print <<END;
<hr>
<address>Lincoln D. Stein</address><br>
<a href="/">Home Page</a>
END
}

Оставленный как есть, этот сценарий демонстрирует поведение, которое мы обсуждаем. Использование -nosticky, похоже, не помогло.

Однако, если я добавлю Delete_all после do_work и перед print_prompt (), вот так:

print header;
print start_html("Example CGI.pm Form");
print "<h1> Example CGI.pm Form</h1>\n";
do_work();
Delete_all();
print_prompt();
print_tail();
print end_html;

Тогда значения по умолчанию не заполняются заранее.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...