Perl Cgi中的程序提交按钮

时间:2015-11-17 20:47:51

标签: perl cgi perl-module

我有一个简单的调查表格,我使用Perl CGI这样做,不会使用交互式HTML文档。我遇到的问题是我不知道如何确定单击了哪个提交按钮,如果是,请继续下一个问题或转到上一个问题。我已经为按钮设置了值,但我不确定如何使用该值来继续下一个问题。 (我在Perl CGI上相当新,请原谅这些邋code的代码。谢谢)

#!c:/Perl/bin/perl.exe

use CGI;
use CGI::Carp qw(fatalsToBrowser);

if ( $ENV{'REQUEST_METHOD'} eq "POST" ) {
    $form_size = $ENV{'CONTENT_LENGTH'};
    read( STDIN, $form_data, $form_size );
} else {
    $form_data = $ENV{'QUERY_STRING'};
}

$form_data =~ s/%([\dA-Fa-f][\dA-Fa-f])/pack ("C", hex ($1))/eg;
@fields = ( split( /&/, $form_data ) );
$size = @fields;

for ( $i = 0; $i < $size; $i++ ) {
    ( $key, $value ) = ( split( /=/, $fields[$i] ) );
    $value =~ s/[;<>\(\)\{\}\*\|'`\&\$!#:"\\]/\ /g;    # Syntax Highlighting fix: '
    $value =~ s/[+]/\ /g;
    $my_hash{$key} = $value;
}

my $q = new CGI;
print $q->header("text/html"), $q->start_html( -title => "Survey", -bgcolor => "blue" );

@labels = ( "Not at all", "", "Somewhat", "", "Extremely" );
@labels2 = ( "No", "Yes", "N/A" );

print $q->submit( 'prev_button', 'Prev' );
print $q->submit( 'next_button', 'Next', 'Javascript: validate_form()' );

if ( submit . value == Prev ) {
    if ( $size == 0 ) {
        $size = 0;
    } else {
        $size = $size - 1;
    }
} elsif ( submit . value == Next ) {
    if ( $size == 6 ) {
        $size = 6;
    } else {
        $size + 1;
    }
}

if ( $size == 0 ) {
    print $q->p("1. Please enter your name:");
    print $q->textfield( 'q1', '', 50, 80 );
} elsif ( $size == 1 ) {
    print $q->p("2. Did you find the information included within this web site useful?");
    print $q->radio_group( 'q2', [ '1', '2', '3', '4', '5' ], "-", 'false', \%labels );
} elsif ( $size == 2 ) {
    print $q->p("3. Is the web site easy to navigate?");
    print $q->radio_group( 'q3', [ '1', '2', '3', '4', '5' ], "-", 'false', \%labels );
} elsif ( $size == 3 ) {
    print $q->p("4. Were you able to find the information you were looking for?");
    print $q->radio_group( 'q4', [ '1', '2', '0' ], "-", 'false', \%labels2 );
} elsif ( $size == 4 ) {
    print $q->p("5. What other information would you like to be included in the web site?");
    print $q->textarea( 'q5', '', 10, 50 );
} elsif ( $size == 5 ) {
    print $q->p("6. What suggestions you might have for our website improvement?");
    print $q->textarea( 'q5', '', 10, 50 );
} elsif ( $size == 6 ) {
    print $q->p("Thank you for your input.");
}

print $q->end_html;

exit(0);

2 个答案:

答案 0 :(得分:1)

使用param方法:

if ($q->param('prev_button') eq 'Prev') {
...
if ($q->param('next_button') eq 'Next') {

最好为所有提交按钮使用相同的名称,因为不可能同时按下多个按钮。然后,您可以根据值使用调度表。

my $other_page = {  Prev => \&previous_page,
                    Next => \&next_page,
                 }->{ $q->param('submit') };
$other_page->() if $other_page;

答案 1 :(得分:0)

你似乎在猜测这些东西是如何运作的。当您使用CGI模块时,在花费更多时间尝试使用它之前,最好先阅读its documentation一次或两次。

关于您的代码的一些观点。

  1. 代码中始终有use strictuse warnings。并解决他们将向您展示的所有问题。
  2. CGI模块有一个param()方法,可让您访问传递给程序的参数。使用它将使您在程序顶部丢失所有可怕的参数解析代码。
  3. 请不要使用new CGI语法创建新的CGI对象。 CGI->new更不容易出错。
  4. 不推荐使用CGI模块中的HTML创建方法。请考虑使用模板系统。您还可以考虑使用基于PSGI的解决方案而不是CGI(被认为是死技术)。请参阅CGI::Alternatives以获取建议。
  5. 您的实际问题似乎是由代码中的一些语法错误引起的。

    if ( submit . value == Prev ) {
    

    这是无效的Perl。我希望它会导致语法错误消息写入您的错误日志。由于您有两个提交按钮,您可能需要:

    if ($my_hash{prev_button}) {
        ...
    } elsif ($my_hash{next_button}) {
        ...
    }
    

    但是,正如其他人所说,提交按钮的名称可能更好。

    if ... else ...街区内的事情有点奇怪。这样:

    if ( $size == 0 ) {
        $size = 0;
    } else {
        $size = $size - 1;
    }
    

    可以简化为:

    $size-- if $size != 0;
    

    而且:

    if ( $size == 6 ) {
        $size = 6;
    } else {
        $size + 1;
    }
    

    没有做任何有用的事情。我想你想要:

    if ( $size == 6 ) {
        $size = 6;
    } else {
        $size = $size + 1;
    }
    

    可以简化为:

    $size++ if $size != 6;